クライアントサーバーベースのゲームを作成していますが、サーバーでパケットの送信に問題が発生することがあります。
サーバーに接続されている各クライアントには、独自のインスタンス(クラス名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);
完全なパケットを送信することを確認するにはどうすればよいですか?