社区
Java SE
帖子详情
java中在通过udp传送大量信息时如何防止丢包。具体应怎么作?如何解决?请给出具体的代码。请大家踊跃发言!!!!!!。
v不吃v你
2001-06-16 07:06:00
...全文
540
20
打赏
收藏
java中在通过udp传送大量信息时如何防止丢包。具体应怎么作?如何解决?请给出具体的代码。请大家踊跃发言!!!!!!。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cds123
2001-09-05
打赏
举报
回复
udp肯定丢包。
ender
2001-09-05
打赏
举报
回复
既然怕丢包,为什么要用UDP呢?
我认为之所以要用UDP,就是因为对速度要求比较高,重视数据的实时性,而少量的丢包可以忽略不计,因为即使把丢失的包再传过来,也由于实时性的要求而失去了作用……
如果不是为了以上的目的,你当然该考虑用TCP,而不是不可靠的UDP……
ezhb
2001-09-05
打赏
举报
回复
關注
v不吃v你
2001-06-30
打赏
举报
回复
up
v不吃v你
2001-06-22
打赏
举报
回复
请大家再给一点思路。
能有简单的代码例子也好呀。
v不吃v你
2001-06-22
打赏
举报
回复
请大家看看应如何解决。
上面的例子只是一个简单的试验。
有很多不完善的地方。
请大家指出思想错误的地方。
谢谢。
v不吃v你
2001-06-22
打赏
举报
回复
//小弟最近才研究udp协议,很多地方不太清楚。
//这是我的一个用udp方式发送文件的程序。
//可是但数据很大时,会有严重的丢包现象。
//我应该怎样作呢?
//如何对包序列化?
//又如何在接受端确认呢?
//如何定义自己的数据包呢?
发送端。
////////////////////////////////////////////////
import java.io.*;
import java.net.*;
import java.util.*;
public class UDPMA{
public static void main(String args[]){
new UDPMAThread().start();
}
}
class UDPMAThread extends Thread{
private DatagramSocket socket=null;
UDPMAThread(){
try{
socket=new DatagramSocket();
System.out.println("Listening on port"+socket.getLocalPort());
} catch(java.net.SocketException e){
System.err.println("can't create socket");
}
}
public void run(){
if(socket==null)return;
try{
byte[] buf= new byte[1004];
DatagramPacket packet;
InetAddress address;
int port;
packet=new DatagramPacket(buf,1004);
socket.receive(packet);
address=packet.getAddress();
port=packet.getPort();
FileInputStream in = new FileInputStream("d:/try.mp3");
int len;
int i=0;
while((len=in.read(buf))!=-1){
packet=new DatagramPacket(buf,buf.length,address,port);
socket.send(packet);
System.out.println(++i);
}
in.close();
packet=new DatagramPacket(buf,0,address,port);
socket.send(packet);
System.out.println("end");
}
catch(Exception e){
System.err.println("io exception"+e);
e.printStackTrace();
}
}
protected void finalize(){
if(socket!=null){
socket.close();
socket=null;
System.out.println("close socket");
}
}
}
接受端:
///////////////////////////////////////////////////
import java.io.*;
import java.net.*;
import java.util.*;
public class UDPMB{
public static void main(String args[]){
int port;
InetAddress address;
DatagramSocket socket=null;
DatagramPacket packet;
byte sendBuf[]=new byte[1004];
byte buffer[] = new byte[1004];
try{
socket=new DatagramSocket();
}
catch(java.net.SocketException e){
System.err.println("Could not create datagram socket.");
}
if(socket!=null){
try{
port=2831;
System.out.println("Listening on port"+socket.getLocalPort());
address=InetAddress.getByName("211.92.155.8");
packet=new DatagramPacket(sendBuf,sendBuf.length,address,port);
socket.send(packet);
FileOutputStream out = new FileOutputStream("d:/try2.mp3");
packet=new DatagramPacket(buffer,buffer.length);
int len = buffer.length;
int i=0;
while(len!=0){
socket.receive(packet);
buffer = packet.getData();
out.write(buffer,0,buffer.length);
out.flush();
len =packet.getLength();
System.out.println("len:"+len);
System.out.println(++i);
}
out.close();
socket.close();
}
catch(IOException e){
System.err.println("IOException;"+e);
e.printStackTrace();
}
}
}
}
jackyz
2001-06-22
打赏
举报
回复
非高手,且试着回答一下吧。:)
原则:client / server 之间按一定的“协议”通讯。
比如:每次发送之后都进行确认,没有得到确认信号就重新发送。[可靠性需要付出效率的代价]
前提:已经完成了数据包的“序列”“分割”“重组”等功能。即,要在底层解决问题。
建议:阅读关于TCP/IP底层通讯实现的书籍,比如Tsinghua的那个《TCP/IP网络编程》影印本。
v不吃v你
2001-06-22
打赏
举报
回复
有得罪的地方请高手见谅。
请大家发言讨论呀。
v不吃v你
2001-06-22
打赏
举报
回复
请大家详细的讲讲呀?
我大致知道这样作。
可是java中怎么作才好呢?
v不吃v你
2001-06-17
打赏
举报
回复
我用得是DatagramPacket,DatagramSocket;
要如何定义呢?
hccpro
2001-06-17
打赏
举报
回复
哇塞,bootcool还是菜鸟??那俺是什么??菜菜鸟?呵呵
实话说用UDP的俺没正经做过,但自定义的协议保证要有,比如发送String,你要先发送
一个头信息,其中包含String的长度,并标明内容类型:String,然后接收端就俺String
接收内容,并接收指定的长度,以保证信息内容的完整,
还别忘了发送信息时,标明信息序号,这样接收端才不会接乱了。
大概就这些,考虑周全些就可以,并不太难,只是复杂些罢了。
v不吃v你
2001-06-17
打赏
举报
回复
这问题估计没人回答得出。
而且是周末,“”“”高手都泡妞去了“”“”。backlove说得好。
每人回答或理睬。
滋味不好受亚!!!!!!!!!!!!
难道java板就没有几个专业的人士,德高望中得高手和老师吗?
大家不会都是半路出家得吧。
一只菜鸟得发言:bootcool,大家如果不同意,尽管骂我好了。
一个愿意认真学编程得菜鸟。
v不吃v你
2001-06-16
打赏
举报
回复
能在具体些吗?
hccpro
2001-06-16
打赏
举报
回复
自己定个协议,先发送内容格式及其长度等信息,然后在按此接收内容…………
LOOP
v不吃v你
2001-06-16
打赏
举报
回复
backlove老兄介绍我也认识认识。
不过,能给我一些技术上的指导吗?
backlove
2001-06-16
打赏
举报
回复
这问题估计没人回答得出。而且是周末,高手都泡妞去了,去javaunion问问吧,那里不少java项目经理,我认识两个。
v不吃v你
2001-06-16
打赏
举报
回复
请大家发言呀。
v不吃v你
2001-06-16
打赏
举报
回复
请大虾们发言。
我是菜鸟兼笨蛋,恳请大虾们发言。
菜鸟希望大虾传道,授业,解惑呀。
v不吃v你
2001-06-16
打赏
举报
回复
请大家踊跃发言!!!!!!
请大家踊跃发言!!!!!!
请大家踊跃发言!!!!!!
请大家踊跃发言!!!!!!
两台Android设备间通过
UDP
传送
目录内的文件
这两天下了一个使用
UDP
传输目录内文件的程序,发出来给大家一起看看,共同进步。有问题
请
指教。 由于
udp
丢包
比较厉害,因此使用了自定义的内部协议,进行双方的确认。 程序跑起来后,看网络状况,有
时
候会一卡一卡的。 以下是程序说明: * 本程序集成了数据导出端(服务器端)和数据导入端(客户端),使用
UDP
进行文件传递 * 服务器端的文件来源目录,见Tools
中
SOURCEPATH的设置 * 客户端的文件保存目录,见Tools
中
DESTINATIONPATH的设置,可以根据自己需要进行调整 * * 由于
UDP
存在
丢包
问题,因此Server和Client的通讯需要来回包进行确认,协议包头如下: * 1. "55 aa 99 01",表示客户端发起广播
请
求,
请
求服务器响
应
* 2. "55 aa 99 02 + 服务器的设备名称",表示服务器接收到广播后,响
应
客户端
请
求,把此包指定IP发送客户端(此指定IP地址可以
UDP
广播
信息
包
中
获取) * 3. "55 aa 99 03",表示客户端接收到服务器的响
应
,接着向服务器指定IP
请
求:需要传递的文件总数目和文件总容量(单位为KB) * 4. "55 aa 99 04 + 4字节文件总数目和4字节的文件总容量",表示服务器接收到客户端的0x03
请
求,统计SOURCEPATH
中
的所有文件数目和文件总容量,发送指定IP地址的客户端 * 5. "55 aa 99 05",客户端接收到文件总数目和文件总容量,
请
求服务器发送文件
具体
内容 * 6. "55 aa 99 10 + 文件名称",服务器发送文件名称 * 7. "55 aa 99 11",客户端响
应
,表示接收到服务器发送的0x10包 * 8. "55 aa 99 12+文件内容",服务器端发送
具体
文件内容 * 9. "55 aa 99 13",客户端响
应
,表示接收到服务器发送的0x12包 * 10."55 aa 99 14",服务端高速客户端发送完毕 * * 注意:服务器发送0x10包后,收到客户端的0x11响
应
包,将把文件
具体
内容拆分成N个0x12包,每个包的大小见Tools.byteSize的设置,目前设置为10K, * 服务器没收到一个0x13响
应
包,才能继续发下一个0x12包,已放置
UDP
的
丢包
,另外每个0x12包最多发送10次而无0x13包的响
应
,则发送进程结束,界面提示 * * 本程序已经封装好,调用见TransportFilesActivity.
java
文件
java
udp
丢包
重发,
udp
丢包
重传机制
UDP
如何重发丢失的数据包?
UDP
如何重发丢失的数据包?让我来告诉你答案!
udp
本身没有重发机制。需要用户自己在数据包
中
包含检索标记。接收方,检查到不合格的包,或是没有收到某一包,向发送方发送要求重发。c#在用
udp
传送
数据
时
,
丢包
后怎么才能重传丢?
UDP
自身就是传输非安全性.你要想保证不丢失以及顺序正确是不可能的.推荐您考虑从包头的标识做起例如封装MODEL或者在bYTE数组前加入当前第几分组第几个.等等标识即可socke...
java
socket
丢包
_Socket编程 (异步通讯,
解决
Udp
丢包
) - Part4
Socket编程 (异步通讯,
解决
Udp
丢包
)对于基于socket的
udp
协议通讯,
丢包
问题大家
应
该都见怪不怪了,但我们仍然希望在通讯方面使用
Udp
协议通讯,因为它即
时
,消耗资源少,响
应
迅速,灵活性强无需向Tcp那样建立连接消耗很长的
时
间等等很有优势的理由让我们对
Udp
通讯寄予了厚望。但它也存在一个不好的特点,经常
丢包
是
时
常发生的事。可能各位大侠已经有了很好的
解决
方案,本人在这也只是本着大家共同学...
java
网络编程之
udp
协议
java
网络编程之
udp
协议
Java
实现
UDP
通信
Java
Socket实现通信
UDP
实现可靠传输 要让
UDP
数可靠的
传送
数据,最直接的办法是模拟 tcp 协议的实现,对
UDP
进行 简单的差错重传控制。 我们设定基本的控制规则如下: 1.c 向 s 发送一个数据包,如果 s 收到,必须在 3 秒之内回送一个
应
答包;发送的数据包必须有一 个唯一的序列号,s 回
应
时
的数据包带上这个序列号,当 c 收到
应
答
时
,根据序列号匹配,即 可确认某个消息 s 己收到。 2.如果 c 己发出的消息 3 秒内还未收到
应
答,即认为超
时
,c
应
重发这条消息,最多重
Java SE
62,634
社区成员
307,269
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章