0

ユーザーが「who」という単語を含むメッセージをサーバーに送信したときに、現在サーバー上にいるすべての人を知らせるパケットをユーザーに送り返そうとしています。

これが私のコードです:

else if( response.contains( "who" ) )
{
     System.out.println( "Size of names collection: "+names.size() );

     buf = null;
     buf = names.toString().getBytes();

     int thisPort = packet.getPort();
     packet = new DatagramPacket( buf, buf.length,packet.getAddress(),thisPort );
     socket.send(packet);
}

上記の print ステートメントの出力は 2 で、andrew と james のように 2 人が参加していることを示しています。パッケージ化して送信すると、次のように出力されると予想されます。

[アンドリュー、ジェームズ]

ただし、代わりにクライアントは次のようになります。

[アンドリュー、

以上です。どうしたの?ところで、これにはUDPを使用する必要があり、TCPに切り替えることはできません

アップデート

パケットを受信するクライアント クラスのコードは次のとおりです。

 while( true )
        {
            try
            {
                // Set the buf to 256 to receive data back from same address and port
                buf = null;
                buf = new byte[256];
                packet = new DatagramPacket(buf, buf.length, address, 4445);
                socket.receive(packet);

                String response = new String( packet.getData() );

                // Receive the packet back
                System.out.println( response );
            }
            catch( IOException e )
            {

            }

        }
4

3 に答える 3

4

データグラムは、受信するDatagramPacketに対して宣言したバッファーのサイズであるため、256バイに切り捨てられています。データグラムを長くできる場合は、バッファを大きくしてください。

ベストプラクティスは、受信する予定の最大のデータグラムよりも1つ大きくすることです。次に、そのサイズのものを受け取った場合、アプリケーションプロトコルエラーが発生します。

于 2012-04-18T22:03:19.990 に答える
1

クライアントとサーバーの両方で、送信/受信操作後のDatagramPacketの長さをそれぞれ(getLengthメソッドを使用して)チェックして、同じであることを確認する必要があります。これが最初のヒントになります。名前にどのコレクションを使用していますか?

于 2012-04-18T19:54:39.787 に答える
0

あなたの質問は不完全です。でも..

UDP はパケットを失います。そのため、ファイル転送の目的で UDP を使用することは信頼できません。Adobe RTMFP は UDP を使用して、多くのパケットが失われるオーディオおよびビデオ データを転送します。ただし、オーディオ/ビデオ コンテンツのストリーミングは、TCP と比較すると非常に高速です。これがあなたの質問に答えているかどうかはわかりませんが、UDP はパケットを失うと言いたいだけです。

于 2012-04-18T18:09:29.300 に答える