私はJava
に実験的なゲームサーバーを構築しています。UDPソケットデータグラム受信パケット2倍で完全なメッセージを取得
クライアントが送信:メッセージを受信する
length: 22\r\n
playerId: 0\r\n
\r\n\r\n
this is a test message
Java
コード:これは、クライアントによって送信されたメッセージの40のバイトを受信しない
String message = "";
byte[] buf = new byte[20];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socketServer.receive(packet);
message += new String(buf, "UTF8");
buf = new byte[20];
packet = new DatagramPacket(buf, buf.length);
socketServer.receive(packet);
message += new String(buf, "UTF8");
、それは20のバイトを受信し、第二にはsocketServer.receive(packet)
新しいメッセージのためにハングアップします。 DEFによって
理由:データグラムが受信されるまで
この方法ブロック。 の長さフィールドには、受信した メッセージの長さが含まれています。メッセージがパケットの長さより長い場合、 メッセージは切り捨てられます。
私は20バイトのメッセージともう1つの20バイトのメッセージを読むことができる必要があります。これはどのように達成できますか?
私はメッセージがどれくらい長く続くかわからないので、これが必要です。
String message = "";
while (!message.contains("\r\n\r\n")) { //"\r\n\r\n" marks end of message
byte[] buf = new byte[20];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socketServer.receive(packet);
message += new String(buf, "UTF8");
}
これは、メッセージが\r\n\r\n
で終わると仮定すると、完全なメッセージを取得します。私はこのような何かをしたいです。
UDP
プロトコルで処理する必要があります。私はJava
のソケットに新しいですが、私はそこに何かがあると仮定して、それを見つけることができません。前もって感謝します。
これがパフォーマンスに影響しますか?バッファーを本当に高く設定することは悪い可能性があるようですが、わかりません。 –
@PatrickLorioには64kバッファがありますか?わずかなことではなく、ちょっとしたRAMです。 – Alnitak
UDPデータグラムの最大サイズは65535-28バイトです。 – EJP