当前页面: 开发资料首页 → J2SE 专题 → 关于DatagramSocket接收UDP数据时的效率问题
关于DatagramSocket接收UDP数据时的效率问题
摘要: 关于DatagramSocket接收UDP数据时的效率问题
我写了一个用UDP协议传送大文件的程序,把文件分成1024的小块,并为每块编号,发送方每秒发送1MB,接收方接收时丢包率相当可怕,近一半的包丢失(局域网上测试),用抓包工具发现大部分的包都到达了接收端,为什么丢包这么严重。哪位大侠有这方面的开发经验请指教.
站内联系或发邮件zouwt@buptnet.edu.cn
/**
* @ Receive.java
*/
package receive;
import java.io.*;
import java.net.*;
import java.nio.*;
/**
* @author 邹维涛 2006-9-1
* @Copyright(c) Ipv6 @ BUPT
* @测试网络接收速度
*/
public class Receive extends Thread {
// socket
private DatagramSocket receiveSocket = null;
// packet
private DatagramPacket receivePacket = null;
// 网络缓存
// private ByteBuffer buf = null;
// 监听端口
private final int port = 7777;
// 包的大小,包括1024字节数据和4字节编号
private final int packetSize = 1024 + 4;
// 初始化接收缓存
private byte[] buf = new byte[this.packetSize];
// 接收到的包数目
int packetCnt = 0;
// 接收到的数据总量
int dataSize = 0;
/**
* 构造函数,初始化
*/
public Receive() {
super();
// TODO Auto-generated constructor stub
// 初始化接收socket
try {
this.receiveSocket = new DatagramSocket(this.port);
} catch (SocketException e) {
e.printStackTrace();
}
// 初始化packet
this.receivePacket = new DatagramPacket(buf, this.packetSize);
}
public void run() {
boolean control = true;
System.out.println(-#34;开始接收-#34;);
int numRead = 0;
// 第一个包到达的时间
long t1 = 0;
// 最后一个包接到达的时间
long t2 = 0;
// 接收过程的总时间(单位ms)
int t = 0;
// 用于提取包中的编号
ByteBuffer tempConvertor = ByteBuffer.allocate(4);
while (control) {
// 接收一个包,如果网络上没有包到达,程序会在此阻塞
try {
this.receiveSocket.receive(this.receivePacket);
tempConvertor.put(buf, 0, 4);
numRead = this.receivePacket.getLength();
this.packetCnt++;
dataSize += numRead;
System.out.println(-#34;收到第-#34; + tempConvertor.getInt(0)
+ -#34;个包,接收的字节数为-#34; + numRead);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(-#34;异常-#34;);
e.printStackTrace();
break;
}
}
// 关闭socket
receiveSocket.close();
t2 = System.currentTimeMillis();
t = (int) (t2 - t1);
System.out.println(-#34;共收到-#34; + this.packetCnt + -#34;个包 ,接收到数据-#34; + this.dataSize
+ -#34;字节-#34;);
System.out.println(-#34;接收速度-#34; + ((float) this.dataSize * 1000 / 1024 / t)
+ -#34;KB/s-#34;);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Receive rcv = new Receive();
rcv.start();
}
}
??
UDP丢包是很正常的啊,可能是你的发送速度太快了吧
发送速度只有32KB/s,再者,要实现文件传送,传送速度就应该有一定要求的,不能太慢。
而且UDP丢包是到达本地后来不及接收丢失的,已经用抓包工具试过了,大部分都能抓到,问题是如何减少本地丢包率.
用了Java就别太在乎效率了。
减少丢包方法:
1:设置缓冲!
2:使用线程池。
可以两个结合使用
局域网丢包没有这么严重把,使用缓冲试一下。
如果还丢的话,用udp然后自己实现tcp的功能。
不同意
healer_kx($stdout-#60;-#60;-#34;甘草留言于#{Time.now}-#34;) 的说法:
用了Java就别太在乎效率了。
设置了缓存后,丢包少了,谢谢各位