2012-04-18 28 views
0

我试图发回一个数据包给用户,通知他们当前在服务器上的所有人,当他们发送一条消息到服务器上有“who”这个词的时候。UDP在这里丢失了我的数据包的一部分吗?

这里是我的代码:

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); 
} 

上面打印语句的输出是2,表明有两个人,例如安德鲁和詹姆斯。现在,当我打包并发送它,我会期待它输出这样的:

[安德鲁,詹姆斯]

但不是客户端获取:

[安德鲁,

并且那它。有什么问题? BTW我不得不使用UDP,这和不能切换到TCP

UPDATE

下面是客户端类中接收的数据包的代码:

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

我想你刚刚发布了一半你的问题 – Chirlo 2012-04-18 18:04:35

+0

所以任何想法的人? – Katana24 2012-04-18 18:53:52

+0

你是说这种事情总是发生,或者只是偶尔和随意地发生? – 2012-04-18 18:57:45

回答

3

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

最好的做法是使它比您期望收到的最大的数据报大一点。然后如果您收到一个大小的应用程序协议错误。

+0

感谢队友现在的作品。我认为,为了解决协议错误,我会创建一个方法来记录接收到的最新数据包的大小,然后将接收缓冲区设置为比所记录的大513个字节 - 您的想法是什么?还有为什么数据包被截断? – Katana24 2012-04-18 22:21:21

+0

@ Katana24因为这就是它在Javadoc中所说的:“如果消息比数据包的长度长,则消息被截断”。数据报通过UDP完整保存,但是随后Java或更可能是Sockets API不得不截断它以将其压缩到您的256字节中。很难看到它还能做些什么。 – EJP 2012-04-18 23:16:29

+0

可以理解 - 但是像数组列表这样的集合必须比它们的字符串对象大很多 - 因为我手动创建了一个具有相同名称和字符串的字符串,并将它们发送并且没有问题。 – Katana24 2012-04-19 09:52:15

0

你的问题不完整。但是..

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

+0

重新检查我的帖子 - 是的,我知道这个 – Katana24 2012-04-18 18:12:05

+2

然而,它不会丢失部分数据包,如果一个数据包到达,它是完好无损的 – 2012-04-18 19:03:14

1

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

+0

我使用数组列表,你知道答案吗?如果是这样,请告诉我:P花了一整天 – Katana24 2012-04-18 21:36:53

+0

好的 - 我检查了它,在服务器代码中,发送的数据包的长度是,对于两个客户端1026.当接收到数据包时,数据包长度是256。这里发生了什么? – Katana24 2012-04-18 21:42:23

+0

好的答案队友:P – Katana24 2012-04-18 22:15:47

相关问题