0

クライアントサーバーベースのゲームを作成していますが、サーバーでパケットの送信に問題が発生することがあります。

サーバーに接続されている各クライアントには、独自のインスタンス(クラス名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);

完全なパケットを送信することを確認するにはどうすればよいですか?

4

1 に答える 1

0

プロデューサーとコンシューマーのパラダイムを使用し、ByteBuffer のキューと別のスレッドを使用してパケットを送信します。すべてのプロデューサー スレッドに独自の ByteBuffer があることを確認し、各 ByteBuffer は完了したときにのみキューに入れられます。

于 2012-10-27T14:18:00.193 に答える