gpt4 book ai didi

java - 通过 udp 发送的图像已损坏

转载 作者:行者123 更新时间:2023-12-01 07:13:20 24 4
gpt4 key购买 nike

我正在尝试用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

最佳答案

  1. 如果您要与自己建立联系,请确保使用:

    Socket.setReceiveBufferSize

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

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

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

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

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

关于java - 通过 udp 发送的图像已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9456977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com