通过udp发送的图像已损坏

时间:2012-02-26 20:44:46

标签: java udp

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

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

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

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

每当接收者确实设法接收所有数据包时,结果图像是: enter image description here

2 个答案:

答案 0 :(得分:6)

  1. 如果您要自己连接,请务必使用:

    Socket.setReceiveBufferSize
    

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

  2. 做测试。您实际发送的数据包。尝试从发送方本身的数据报包中创建您的图像,这样您就可以发送您真正期望的内容。在接收方,确切地检查哪些数据包丢失并尝试观察模式。

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

  4. 另请注意,在设置连接时,如果发送方说在接收方之前的毫秒开始,则可能会丢失多个数据包,因此接收方应始终在发送方开始执行任何操作之前启动并准备就绪。 (如果线程没有严格同步,即使在localhost上也会发生这种情况)

  5. 通过UDP发送图像并不是一个好主意。图像,文本是应该通过TCP发送的数据类型 - 这里的部分丢失会产生重大影响。 VOIP是一种较少关注数据包丢失的服务,尤其是交错和压缩服务。

答案 1 :(得分:2)

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

相关问题