论坛首页 Java企业应用论坛

关于JAVA线程的数据转发(游戏项目中间层)

浏览 5969 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-12-16  
常来JAVAEYE看看,但从没有发过贴,没有为JAVAEYE发热发光过,今天闲下来,就把我以前做的游戏项目的中间层发出来,所谓中间层就是前台发过来的数据要在中间层过滤,保证数据的安全,不会让客户端直接连接游戏服务层.
下面将列出几个关键类

转发服务器类

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);
}
}

}


   发表时间:2010-12-18  
功力不够 看不懂
0 请登录后投票
   发表时间:2010-12-19  
只是一种比较简单的中规中矩的做法
0 请登录后投票
   发表时间:2010-12-20  
lyjdamzwf 写道
只是一种比较简单的中规中矩的做法

嗯,确实是。
0 请登录后投票
   发表时间:2010-12-22  
看到了flash的影子
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics