UDP是否会丢失我的数据包的一部分?

时间:2012-04-18 18:00:54

标签: java

我试图将数据包发回给用户,告知他们当前服务器上的所有人,当他们向服务器发送消息时,其中包含“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。现在,当我打包并发送它时,我希望它输出:

[安德鲁,詹姆斯]

但客户得到了:

[安德鲁,

就是这样。有什么问题?顺便说一句,我必须使用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 )
            {

            }

        }

3 个答案:

答案 0 :(得分:4)

您的数据报被截断为256个字节,因为这是您为接收DatagramPacket声明的缓冲区的大小。如果您的数据报可以更长,请将缓冲区放大。

最佳做法是使其比您希望收到的最大数据报更大。然后,如果您收到一个那么大的应用程序协议错误。

答案 1 :(得分:1)

您应该分别在发送/接收操作(使用getLength方法)检查​​客户端和服务器上的DatagramPacket的长度,以确保它是相同的,这将是第一个提示。您为名称使用了什么集合?

答案 2 :(得分:0)

您的问题不完整。然而..

UDP丢失数据包。这就是为什么使用UDP进行文件传输是不可靠的。 Adobe RTMFP使用UDP传输丢失了许多数据包的音频和视频数据。但与TCP相比,音频/视频内容流传输速度确实更快。我不知道这是否回答了你的问题,我只想说UDP确实丢失了数据包。