java tcp socket 通信问题

2025-01-19 08:15:13
推荐回答(1个)
回答1:

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

首先:你需要自定义一份双方约定的通信机制,
其次: 对每个连进来的客户按用户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不同而有不同。 如聊天消息包含四个字段,String 聊天内容、 User 发送者、 User 接收者、Text文字排版信息

服务端SeverSocket收到这个消息后,压入接收缓冲区, 接收缓冲线程分析其中结构,根据Type和Command的类型实例化出相应消息类, 该消息类能自动将后面的字节流实例化自身的字段。从而得到接收方和发送方, 得到接收方后再将消息封装好压入到发送队列

这个结构除完全适合聊天系统以外,以后要加入新内容将会非常容易!

如果有什么疑问欢迎call我, 我不负责写代码,但可以指点你。 另外,我的回答记录中有用nio设计的聊天室BBS代码。也是帮一个学生做的。你可以看看