java中在通过udp传送大量信息时如何防止丢包。具体应怎么作?如何解决?请给出具体的代码。请大家踊跃发言!!!!!!。

v不吃v你 2001-06-16 07:06:00
...全文
539 20 打赏 收藏 转发到动态 举报
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
  • 打赏
  • 举报
回复
请大家踊跃发言!!!!!!
请大家踊跃发言!!!!!!
请大家踊跃发言!!!!!!
请大家踊跃发言!!!!!!
这两天下了一个使用UDP传输目录内文件的程序,发出来给大家一起看看,共同进步。有问题指教。 由于udp丢包比较厉害,因此使用了自定义的内部协议,进行双方的确认。 程序跑起来后,看网络状况,有候会一卡一卡的。 以下是程序说明: * 本程序集成了数据导出端(服务器端)和数据导入端(客户端),使用UDP进行文件传递 * 服务器端的文件来源目录,见ToolsSOURCEPATH的设置 * 客户端的文件保存目录,见ToolsDESTINATIONPATH的设置,可以根据自己需要进行调整 * * 由于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文件

62,634

社区成员

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

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