在套接字中发送完整的数据包

时间:2012-10-27 13:52:25

标签: java sockets

我正在制作基于客户端服务器的游戏,但服务器有时会发送数据包。

每个连接到服务器的客户端都有自己的实例(类名Peer)。此实例有一个名为ByteBuffer的{​​{1}}变量。对等类是Runnable,因此每个客户端都有自己的线程。

服务器可以向客户端发送不同类型的数据包,数据包的第一个字节是“操作码”,以便客户端知道它是什么数据包。当客户端知道操作码时,它也知道数据包的大小。

在Peer类的线程中buffer的每个tick上,ByteBuffer中的所有数据包都将被发送给客户端。但有时在bytebuffer中有半个数据包,因为另一个线程同时在其中放入字节。然后客户端读取操作码,但缺少数据包的字节。

这是在bytebuffer中发送字节的Peer类的代码:

while-loop

如何确保它发送完整的数据包?

1 个答案:

答案 0 :(得分:0)

使用producer-consumer范例,Queue of ByteBuffer和一个单独的线程来发送数据包。 确保每个生成器线程都有自己的ByteBuffer,并且每个ByteBuffer只在完成后才会被放入队列中。