【问题标题】:image sent over udp damaged通过 udp 发送的图像损坏
【发布时间】:2012-02-26 20:44:46
【问题描述】:

我正在尝试在 java 中实现一个 udp 图像传输程序。发送方将图像分解为 1024 字节的数据包,其中前 2 个字节是一个带有序列号的短字节,第 3 个字节是一个标志,指示该数据包是否是最后一个。

当我执行接收器并使用发送器发送图像时,传输的图像不完整并且上面有奇怪的颜色。 其他时候我执行receiver,发了几百包就卡住了。

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

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

只要接收器确实设法接收到所有数据包,这里就是生成的图像:

【问题讨论】:

  • 我经常建议您在尝试使用 UDP 之前使用 TCP 实现传输/连接,因为可靠使用要复杂得多。

标签: java udp


【解决方案1】:
  1. 如果您要连接到自己,请确保使用:

    Socket.setReceiveBufferSize
    

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

  2. 进行测试。您实际发送的数据包。尝试从发送方本身的数据报包创建您的图像,因此您发送的是您实际期望的内容。在接收端准确检查哪些数据包丢失并尝试观察模式。

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

  4. 1234563 (如果线程没有严格同步,即使在本地主机上也会发生这种情况)

通过 UDP 发送图像并不是一个好主意。图像、文本是真正应该通过 TCP 发送的数据类型——这里的部分丢失可能会产生重大影响。 VOIP 是最不关心数据包丢失的一种,尤其是在交织和压缩方面。

【讨论】:

    【解决方案2】:

    UDP 不是可靠的传输协议。如果要可靠性,需要自己实现或者使用TCP 在此处阅读UDP

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-25
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      相关资源
      最近更新 更多