通过udp发送的图像损坏

问题描述:

我想在java中实现udp图像传输程序。发送方将图像分成1024字节的数据包,其中前2个字节是带有序列号的短字,第3个字节是表示数据包是否是最后一个的标志。通过udp发送的图像损坏

当我执行接收器并使用发件人发送图像时,传输的图像不完整并且颜色奇怪。 其他时候,当我执行接收器时,发送几百个数据包后它会粘住。

下面是接收器的代码,它接收数据包并将其写入字节流。

 double DATAGRAM_MAX_SIZE = 1024; 
     byte[] recieveData = new byte[(int) DATAGRAM_MAX_SIZE]; 
     ByteArrayInputStream bais = new ByteArrayInputStream(recieveData); 
     DataInputStream dis = new DataInputStream(bais); 

     // Loop until all packets received 
     byte isLast = 0; 
     while(true) { 
      receievePacket = new DatagramPacket(recieveData, recieveData.length); 
      try { 
       receieveSocket.receive(receievePacket); 
      } catch (IOException e) { 
       System.out.println("Error receieving packet"); 
       e.printStackTrace(); 
      } 
      Short sequenceNum = dis.readShort(); 
      isLast = dis.readByte(); 
      System.out.println(recieveData[0] + " " + recieveData[1] +" " + recieveData[2]); 
      if (!seenSeq.contains(sequenceNum)) { 
       seenSeq.add(sequenceNum); 
       bos.write(recieveData, 3, (int) DATAGRAM_MAX_SIZE-3); 
      } 
      dis.reset(); 
      // Terminate loop if last packet received 
      if (isLast == 1) { 
       break; 
      } 
     } 

     // Byte array to hold image data from stream 
     byte[] imageData = bos.toByteArray(); 

每当接收并管理在这里receieve所有数据包是产生的图像: enter image description here

+0

我经常建议你在尝试UDP之前使用TCP实现一个传输/连接,因为它可靠地使用要复杂得多。 – 2012-02-26 21:09:49

  1. 如果要连接到你自己一定要利用:

    Socket.setReceiveBufferSize 
    

    我遇到的问题是发送给自己的速度非常快,以至于在某些时候缓冲区溢出并且一些数据包被简单地丢弃。 (甚至在连接到自己时假设理想的网络条件)

  2. 做测试。你实际发送了什么数据包。尝试从发件人一侧的数据包数据包创建图像,以便发送您实际期望的内容。在接收端,确认哪些数据包丢失,并尝试观察模式。

  3. 如前所述,UDP是不可实现的 - 数据包可能不会到达,也可能以错误的顺序到达。检查是否按正确的顺序将数据包无序放置。

  4. 另请注意,建立连接后,如果发送者说在接收者之前开始毫秒,那么几个数据包可能会丢失,因此在发件人开始执行任何操作之前,接收者应始终处于启动状态。 (如果线程没有严格同步,这种情况甚至发生在本地主机上)

通过UDP发送图像并不是真的太棒了。图像,文本是真正应通过TCP发送的数据类型 - 这里的部分丢失会产生重大影响。对于丢包尤其是交织和压缩,VOIP是一个不太关心的问题。

UDP不是一个可靠的传输协议。如果你想要的可靠性,你需要自己实现它,或者使用TCP 阅读UDP这里