我正在制作基于客户端服务器的游戏,但服务器有时会发送数据包。
每个连接到服务器的客户端都有自己的实例(类名Peer
)。此实例有一个名为ByteBuffer
的{{1}}变量。对等类是Runnable,因此每个客户端都有自己的线程。
服务器可以向客户端发送不同类型的数据包,数据包的第一个字节是“操作码”,以便客户端知道它是什么数据包。当客户端知道操作码时,它也知道数据包的大小。
在Peer类的线程中buffer
的每个tick上,ByteBuffer中的所有数据包都将被发送给客户端。但有时在bytebuffer中有半个数据包,因为另一个线程同时在其中放入字节。然后客户端读取操作码,但缺少数据包的字节。
这是在bytebuffer中发送字节的Peer类的代码:
while-loop
如何确保它发送完整的数据包?
答案 0 :(得分:0)
使用producer-consumer范例,Queue of ByteBuffer和一个单独的线程来发送数据包。 确保每个生成器线程都有自己的ByteBuffer,并且每个ByteBuffer只在完成后才会被放入队列中。