用DatagramSocket发UDP的问题

player008 2005-03-23 08:09:19
用java写的DatagramSocket发UDP包,每秒发250个8K的包都已经发生了丢包的问题,在局域网上调.请问各位大虾有什么办法让可靠性高点?
...全文
239 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
player008 2005-03-30
  • 打赏
  • 举报
回复
这个作用是什么?
虎叔 2005-03-29
  • 打赏
  • 举报
回复
看一下下面这里方法有没有帮助。
DatagramSocket.setTrafficClass()
player008 2005-03-25
  • 打赏
  • 举报
回复
这样测出来,java每秒只能发1000个4K的包左右,而且丢包也挺严重的,远不及c语言的,有那位高手来发表一下意见。
abcdhy 2005-03-24
  • 打赏
  • 举报
回复
在局域网上,其实如果网络比较好,丢包发生少, TCP 的速度也不会比 UDP 慢多少的.

而且局域网的带宽那么大, 对于 TCP 产生的附加字节,根本就可以忽略不计
虎叔 2005-03-23
  • 打赏
  • 举报
回复
UDP协议本身是不可靠传输,如果需要可靠传输,可以考虑自己作包检测重发。
player008 2005-03-23
  • 打赏
  • 举报
回复
本人写的测试程序,大家看看有没有可以优化的。

发送端:
String strServer = textServer.getText();
InetAddress target = InetAddress.getByName(strServer);
//得到目标机器的地址实例
int nPort = Integer.parseInt(textPort.getText());

long lInterval =Long.parseLong(textInterval.getText());
int nTimes = Integer.parseInt(textTimes.getText());


DatagramSocket ds = new DatagramSocket(nPort);
//从端口发送数据报
String strContent = textContent.getText();
//要发送的数据
//byte[] buf = strContent.getBytes();
byte[] buf = new byte[1024*8];//一个包8K
//将数据转换成Byte类型
DatagramPacket op = new DatagramPacket(buf, buf.length, target, nPort);
//将BUF缓冲区中的数据打包
int i = 0;
for(i = 0; i < nTimes; i++){
ds.send(op);
Thread.sleep(lInterval);

}
//发送数据
ds.close();
//关闭连接
}
catch (Exception ex) {
labInfo.setText(ex.getMessage());
}
}

接收端:
byte[] buf = new byte[1024*10];
int i = 0;

long lBegin = 0;
int nPackNum = Integer.parseInt(textPackNum.getText());
try {
int nPort = Integer.parseInt(textPort.getText());
DatagramSocket ds = new DatagramSocket(nPort);

DatagramPacket ip = new DatagramPacket(buf, buf.length);
//创建接收数据报的实例

ds.setSoTimeout(30000);


while (true)
{

ds.receive(ip);
if(i == 1){
lBegin = System.currentTimeMillis();
}
i++;
//阻塞,直到收到数据报后将数据装入IP中
//labInfo.setText((new String(buf)) + i);
if(i == nPackNum) break;
}

labInfo.setText("共接收包[" + i + "]个,时长:["+ (System.currentTimeMillis() - lBegin) +"]");
}
catch (Exception ex) {
labInfo.setText(ex.getMessage() + "[" + i + "]" + (System.currentTimeMillis() - lBegin));

}
player008 2005-03-23
  • 打赏
  • 举报
回复
就是又想快又想可靠点
abcdhy 2005-03-23
  • 打赏
  • 举报
回复
UDP 本来就是不可靠的协议, 你需要可靠,使用 TCP 了

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧