java tcp socket 通信问题

来源:百度知道 编辑:UC知道 时间:2024/07/05 22:52:21
通过一个True循环 将客户端的一个文件(>500M)传到服务器。。。
下面是部分代码
.......
while (true) {
try {
FileTransferDataMessage dataMessage=new FileTransferDataMessage(fileLabel);
int read = 0;
buf = new byte[bufferSize];
if (fis != null) {
read = fis.read(buf);
.....
dataMessage.setBufferSize(read);
//for(int j=0;j<read;j++) {
// dataMessage.getBuf()[j]=buf[j];
//}

dataMessage.setBuf(buf.clone());

clientMonitor.getFileSessionBean().getClient().sendMessage(dataMessage);

这两个问题都可以通过消息机制来解决,
消息机制就是双方约定的通信语言。

首先:你需要自定义一份双方约定的通信机制,
其次: 对每个连进来的客户按用户ID或IP进行编号存入哈希表,以方便索引用户的Socket通道。 每进来一个客户就 hashtable.put(user.name, socket);

最后:双方都还要有两个缓冲数组(可以是数组Object[],也可以是Vector,Arraylist,Hashtable都可以);

一个叫发送缓冲区,一个叫接收缓冲区。每一个都附带一个管理线程。
向客户端发送消息时,并不是马上就发送,而是将消息推入到发送缓冲区排队,
发送缓冲区的线程会每隔一小片时间后就扫描并 pop出一个可发送的消息。
分析这个消息的源发送者和目的发送者,然后hashtable的索引找到目的发送者的socket通道。并发送.

另一个叫接收缓冲区。 Socket的网络线程不断接收到客户的消息,但不是马上就处理,也不会自己亲自处理,而是压入接收缓冲队列等待缓冲队列来处理,自己休息片段又立马再去接收别的客户发过来的消息。 接收缓冲区有自己的线程,它每sleep一小片刻时间后就扫描队列中有无消息到达,如果有(网络线程刚压进一的),则可以采用监听器模式让监听器处理,如果不想那么复杂也可以自己处理, 会分析消息来源和去向,从去向中分析出将要发送给某人,但自己并不发送,而是直接压入到发送缓冲区(这里就接到前面的发送缓冲区介绍中去了)

最后是消息机制的设计。
我公司的游戏都是由我来设计通信机制,实现三网合一,即手机,PC,电视机顶盒三种客户端同玩一桌麻将游戏
一般java设计的游戏中设计如下:
一. 消息头 二.消息体

消息头设计格式如下: 1. 本消息包长度,以方便解析字节;2. 本消息类型TYPE:如一般消息,游戏消息,大厅消息,聊天消息;3.本消息命令类型COMMAND: 如登陆、个人资料修改、登出、聊天。。。。

消息体设计格式一般根据Type和command不同而有不同。 如聊天消息包含四个字段,