我试图在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();
Run Code Online (Sandbox Code Playgroud)
每当接收器确实设法接收所有数据包时,结果图像是:

如果您要自己连接,请务必使用:
Socket.setReceiveBufferSize
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是发送给自己是如此之快,以至于在某些时候缓冲区溢出和一些数据包被简单地丢弃.(甚至在连接到自己时假设理想的网络条件)
做测试.您实际发送的数据包.尝试从发送方本身的数据报包中创建您的图像,这样您就可以发送您真正期望的内容.在接收方,确切地检查哪些数据包丢失并尝试观察模式.
如前所述,UDP是不可实现的 - 数据包可能无法到达,也可能以错误的顺序到达.检查是否按正确顺序放置了数据包.
另请注意,在设置连接时,如果发送方说在接收方之前的毫秒开始,则可能会丢失几个数据包,因此接收方应始终在发送方开始执行任何操作之前启动并准备就绪.(如果线程未严格同步,即使在localhost上也会发生这种情况)
通过UDP发送图像并不是一个好主意.图像,文本是应该通过TCP发送的数据类型 - 这里的部分丢失会产生重大影响.VOIP是一种较少关注数据包丢失,尤其是交错和压缩.
| 归档时间: |
|
| 查看次数: |
1459 次 |
| 最近记录: |