我写了一个用UDP协议传送大文件的程序,把文件分成1024的小块,并为每块编号,发送方每秒发送1MB,接收方接收时丢包率相当可怕,近一半的包丢失(局域网上测试),用抓包工具发现大部分的包都到达了接收端,为什么丢包这么严重。哪位大侠有这方面的开发经验请指教.
站内联系或发邮件[email protected]/**
 * @ 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("开始接收"); 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("收到第" + tempConvertor.getInt(0)
+ "个包,接收的字节数为" + numRead);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("异常");
e.printStackTrace();
break;
}
} // 关闭socket
receiveSocket.close();
t2 = System.currentTimeMillis();
t = (int) (t2 - t1);
System.out.println("共收到" + this.packetCnt + "个包 ,接收到数据" + this.dataSize
+ "字节");
System.out.println("接收速度" + ((float) this.dataSize * 1000 / 1024 / t)
+ "KB/s");
} /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
Receive rcv = new Receive();
rcv.start(); }}

解决方案 »

  1.   

    UDP丢包是很正常的啊,可能是你的发送速度太快了吧
      

  2.   

    发送速度只有32KB/s,再者,要实现文件传送,传送速度就应该有一定要求的,不能太慢。
    而且UDP丢包是到达本地后来不及接收丢失的,已经用抓包工具试过了,大部分都能抓到,问题是如何减少本地丢包率.
      

  3.   

    用了Java就别太在乎效率了。
      

  4.   

    局域网丢包没有这么严重把,使用缓冲试一下。
    如果还丢的话,用udp然后自己实现tcp的功能。
      

  5.   

    不同意
    healer_kx($stdout<<"甘草留言于#{Time.now}") 的说法:
    用了Java就别太在乎效率了。