浏览 5969 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-16
下面将列出几个关键类 转发服务器类 package org.dreamcity.middle.server; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import org.apache.log4j.Logger; import org.dreamcity.middle.common.AbstractConnectionThread; import org.dreamcity.middle.common.util.TransmissionException; import org.dreamcity.middle.common.util.XMLElement; import org.dreamcity.middle.common.util.Base64; import org.dreamcity.middle.common.util.Constant; /** * 唐剑钢 * tjgd1@qq.com **/ public class ClientMiddleWorkThread extends AbstractConnectionThread { protected ServerMiddleWorkThread serverThread; static Logger logger = Logger.getLogger(ClientMiddleWorkThread.class.getName()); public ClientMiddleWorkThread(Socket clientSocket) { super(clientSocket); } public void cleanup() { //logger.info("客户端转发器断开"); if(serverThread!=null){ serverThread.stopLoop(); } ConnectionClientServer.getInstance().ipfilter.removeip(this); } public void parse(XMLElement message,String smessage) throws TransmissionException { if (message != null) { if (message.getName().equals(Constant.CONNECT_MESSAGE)) { //连接游戏服务器 try { Socket socketb=new Socket(Constant.GAMEIP,Constant.GAMEPORT); if(socketb!=null){ this.serverThread=new ServerMiddleWorkThread(socketb); //logger.info("连接游戏服务器成功"); this.serverThread.setClientThread(this); this.serverThread.send("<policy-file-xyquest/>"); // logger.info("客户端线程向服务器转发消息是: "+smessage); this.serverThread.send(smessage); this.serverThread.send("<client_ip ipaddress="+"\""+this.socket.getInetAddress()+"\""+"/>"); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }else{ if(smessage!=null){ // logger.info("客户端线程向服务器转发消息是: "+smessage); if(smessage.indexOf("policy-file-xxquest")==-1){ System.out.println("客户端线程向服务器转发消息是: "+smessage); this.serverThread.send(smessage); } } } } } } 连接客户端 package org.dreamcity.middle.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.BindException; import java.net.ServerSocket; import java.net.Socket; import org.apache.log4j.Logger; import org.dreamcity.middle.common.util.Constant; import org.dreamcity.middle.common.util.Config; import org.dreamcity.middle.common.FilterIp; /** * 唐剑钢 * tjgd1@qq.com **/ public class ConnectionClientServer { private static ConnectionClientServer instance; static Logger logger = Logger.getLogger(ConnectionClientServer.class .getName()); protected FilterIp ipfilter; public ConnectionClientServer() { Config.init(); ipfilter = new FilterIp(); } public static ConnectionClientServer getInstance() { if (instance == null) instance = new ConnectionClientServer(); return instance; } public void run() { //logger.info("--------------------------消息转发器服务器启动----------------------"); System.out .println("--------------------------消息转发器服务器启动----------------------"); ServerSocket listenSocket = null; try { // Set up the server first of all listenSocket = new ServerSocket(Constant.FLASHPORT); while (true) { // listen for and accept the connection Socket clientSocket = listenSocket.accept(); try{ //ipfilter.CheckIp(clientSocket.getInetAddress().toString()); System.out.println(clientSocket + " HASHCODE " + clientSocket.hashCode()); BufferedReader br = new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); PrintWriter pw = new PrintWriter(clientSocket .getOutputStream()); char[] by = new char[22]; br.read(by, 0, 22); String head = new String(by); //String head = br.readLine(); if(head!=null&&!head.equals("")){ head = head.trim(); System.out.println("头消息:"+head); if (head.equals("<policy-file-request/>")) { pw.print(this.getXml() + "\0"); pw.flush(); } else { ClientMiddleWorkThread conn = new ClientMiddleWorkThread( clientSocket); pw.print("<table><creatThread/></table>"+"\0"); pw.flush(); System.out.println("中间层创建线程"); } }else { clientSocket.close(); } }catch(Exception e){ //关闭连接 if(clientSocket!=null){ clientSocket.close(); } System.out.println("捕获异常了,准备对外抛出"); //抛出空指针异常,使其被外面的捕获,然后重新启动线程 throw new NullPointerException(); } } } catch (BindException bindEx) { System.out.println("中间层:这里发生socket异常了"); //System.exit(0); } catch (Exception genEx) { System.out.println("中间层:主线程异常了"); genEx.printStackTrace(); }finally{ try { if (listenSocket != null) listenSocket.close(); System.out.println("这里准备重新启动主线程"); this.run(); } catch (IOException ioEx) { System.out.println("重新启动主线程异常,主线程彻底死亡"); } } } public String getXml() { String xml = "<cross-domain-policy>"; xml = xml + "<allow-access-from domain=\"*\" to-ports=\"*\" />"; xml = xml + "</cross-domain-policy>"; return xml; } public static void main(String args[]) { ConnectionClientServer server = ConnectionClientServer.getInstance(); server.run(); } } 转发向客户端类 package org.dreamcity.middle.server; import java.net.Socket; import org.apache.log4j.Logger; import org.dreamcity.middle.common.AbstractConnectionThread; import org.dreamcity.middle.common.util.TransmissionException; import org.dreamcity.middle.common.util.XMLElement; public class ServerMiddleWorkThread extends AbstractConnectionThread { protected ClientMiddleWorkThread clientThread; static Logger logger = Logger.getLogger(ServerMiddleWorkThread.class.getName()); public ServerMiddleWorkThread() { } public ClientMiddleWorkThread getClientThread() { return clientThread; } public void setClientThread(ClientMiddleWorkThread clientThread) { this.clientThread = clientThread; } public ServerMiddleWorkThread(Socket socket) { super(socket); } public void cleanup() { if(clientThread!=null){ clientThread.stopLoop(); } //logger.info("服务端转发器断开"); } public void parse(XMLElement message, String smessage) throws TransmissionException { if(message!=null&&smessage!=null&&!smessage.equals("")){ // logger.info("服务器线程向客户线程转发消息是: "+smessage); System.out.println("服务器线程向客户线程转发消息是: "+smessage); this.clientThread.send(smessage); } } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-12-18
功力不够 看不懂
|
|
返回顶楼 | |
发表时间:2010-12-19
只是一种比较简单的中规中矩的做法
|
|
返回顶楼 | |
发表时间:2010-12-20
lyjdamzwf 写道 只是一种比较简单的中规中矩的做法
嗯,确实是。 |
|
返回顶楼 | |
发表时间:2010-12-22
看到了flash的影子
|
|
返回顶楼 | |