我正在制作基于客户端-服务器的游戏,但服务器有时会在发送数据包时出现问题。
每个连接到服务器的客户端都有自己的实例(类名Peer
)。此实例有一个ByteBuffer
名为 的变量buffer
。对等类是 Runnable,因此每个客户端都有自己的线程。
服务器可以向客户端发送不同类型的数据包,数据包的第一个字节是“操作码”,以便客户端知道它是什么数据包。当客户端知道操作码时,它也知道数据包的大小。
在 Peer 类的线程中的每个滴答声中while-loop
,ByteBuffer 中的所有数据包都将发送到客户端。但有时字节缓冲区中有一半数据包,因为另一个线程同时将字节放入其中。然后客户端读取操作码但缺少数据包的字节。
这是发送字节缓冲区中字节的 Peer 类的代码:
ByteBuffer buffer = this.buffer.duplicate();
this.buffer.clear();
int size = buffer.position();
buffer.flip();
byte[] data = new byte[size];
buffer.get(data);
out.write(data);
如何确保它发送完整的数据包?