用DatagramSocket发UDP的问题 UDP 本来就是不可靠的协议, 你需要可靠,使用 TCP 了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 本人写的测试程序,大家看看有没有可以优化的。发送端: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)); } UDP协议本身是不可靠传输,如果需要可靠传输,可以考虑自己作包检测重发。 在局域网上,其实如果网络比较好,丢包发生少, TCP 的速度也不会比 UDP 慢多少的.而且局域网的带宽那么大, 对于 TCP 产生的附加字节,根本就可以忽略不计 这样测出来,java每秒只能发1000个4K的包左右,而且丢包也挺严重的,远不及c语言的,有那位高手来发表一下意见。 看一下下面这里方法有没有帮助。DatagramSocket.setTrafficClass() 学习java 程序如何调用另一程序?java 又是循环问题。。。 关于JAVA的DES字符串加密 javac 提示找不到文件。。。 谁能将1122010103转成2005-7-22 13:28? classpath问题 有兴趣的来看看这是什么问题,不散分,解决全给 如何将字符串转化为数字? 用JBUILDER7开发WEB APP为何出这样的问题呢? 老问题新问法:如何用面向对象的思想写关于JDBC数据库相关操作,大家给点建议。分不够再开贴。 java中怎么获得一个本地空闲的端口
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)); }
DatagramSocket.setTrafficClass()