0

我试图向用户发送一个数据包,通知他们当前在服务器上的所有人,当他们向服务器发送一条包含“谁”字样的消息时。

这是我的代码:

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 )
            {

            }

        }
4

3 回答 3

4

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

最佳做法是使其比您期望接收的最大数据报大一。然后,如果您收到一个这样的大小,您就会遇到应用程序协议错误。

于 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 回答