作者:Yunir_944 | 来源:互联网 | 2023-06-05 21:52
小弟近来需要做一个基于UDP的“可靠性数据传输”程序,也就是通过在应用层添加相应机制和约束实现利用TCP才能实现的可靠数据传输。只需要在应用层有相应的诸如通讯握手,错误重发,超时重发等等和可靠数据传输
小弟近来需要做一个基于UDP的“可靠性数据传输”程序,也就是通过在应用层添加相应机制和约束实现利用TCP才能实现的可靠数据传输。只需要在应用层有相应的诸如通讯握手,错误重发,超时重发等等和可靠数据传输相关的TCP特性便可(可不考虑拥塞控制,流量控制等额外功能),实现的也就是个模拟;可做成一个客户/服务器端的模式,只是传输层要求建立在UDP基础上,实现可靠性通信便行了,没有其他什么界面要求。各位java语言高手望能帮小弟一把,借此也可以熟悉java的socket网络编程嘛!要是有什么不明白的地方可以提出来,我会马上回复,至于需要分数嘛,这不是问题呀!在这里,小弟先谢谢各位大哥哥大姐姐了……
21 个解决方案
我有一点不明白。数据要到达应用层一定要先经过其他的六层才行。你这个程序的要求是为了什么目的呢?有什么实际的意义?
bluesmile979(笑着)
TCP/IP 只有四层的
不过假如你真的实现了
>在应用层有相应的诸如通讯握手,错误重发,超时重发等等和可靠数据传输相关的TCP特性
这和 TCP 本身又有什么区别呢?
只不过是在不同的地方实现罢了
实际上tcp/ip和OSI协议中其中一点不同就是tcp/ip协议网络层是不可靠的,没有实现面向连接的可靠传输,可靠传输是使用在传输层的tcp协议,现在楼主想用udp协议实现传输在应用层进行可靠性控制,对程序来说增加了处理的工作量,但也增加了程序灵活性(当然也要看程序中是否需要使用这种灵活性).
要实现可靠的udp信息发送可以这样处理
1将你要发送的数据以500个字节进行分包。
2在每个包的头部加上序列号,这样每个字节包在512个字节范围内。
3服务器接收到这种按序列分割的包后按照序列组装起来,如果其中有哪个序列丢失再要求客户重新发送。
不过正如 telenths(_非法操作_)所说的,这样比较象tcp连接了,同时你的编码量比较大
谢谢各位的支持,我只是想实现通过UDP的可靠传输;换句话说就是通过在应用层建立相应的需要TCP才能实现的功能!不知哪位高手愿意拿出一个源码,我们大家都好好学习学习啊!这样也可以对网络的层次结构有更清晰的认识!谢谢以上的各位热心朋友啊
我想基本的手段就是超时重发吧,还有就是接收端反馈ACK,吧,但是超时的时间是多少,定义ACK 倒是蛮麻烦的呢..学习啊
还是感觉没什么实际的意义
TO非法:哦,没注意,把OSI参考模型写上去了。THX:) 不过意思差不多啦,我还是习惯7层的分法。
我想其实你就要对那个dataprampacket那个对数据打包的类进行扩展(如数据包的序号)...然后客户和服务器端建立一个通讯机制(规则)
你可以把你的数据在应用层进行打包吗!打包方式可以参考TCP
这样做好像对处理性能的要求要很高诶!!速度会很慢!!!
一个例子 先执行 Server 在执行 Client
//UDPServer.java
import java.net.*;
public class UDPServer{
public static void main(String args[]){
UDPServer UDP = new UDPServer();
UDP.receive();
}
public void receive(){
try{ //{接收数据的服务器}
byte[] buf = new byte[1000];
DatagramSocket ds = new DatagramSocket(12345); //开始监视12345端口
DatagramPacket ip = new DatagramPacket(buf, buf.length); //创建接收数据报的实例
while (true) {
ds.receive(ip); //阻塞,直到收到数据报后将数据装入IP中
System.out.println(new String(buf));
}
}catch(Exception e){}
}
}
//=======================================================
// UDPClient.java
import java.net.*;
public class UDPClient{
public static void main(String args[]){
UDPClient UDP = new UDPClient();
UDP.send();
}
public void send(){
try{ //{发送数据的客户端}
InetAddress target = InetAddress.getByName("localhost");//得到目标机器的地址实例
DatagramSocket ds = new DatagramSocket(9999);//从9999端口发送数据报
String hello = "Hello, I am come in!";//要发送的数据
byte[] buf = hello.getBytes();//将数据转换成Byte类型
DatagramPacket op = new DatagramPacket(buf, buf.length, target, 12345);//将BUF缓冲区中的数据打包
ds.send(op);//发送数据
ds.close();//关闭连接
}catch(Exception e){}
}
}
我看了你-telenths(_非法操作_)的回贴,真的是非常感谢,但这仅仅是利用了UDP作为网络层的协议并不能保证实现的是TCP功能。在应用层并没有加入任何弥补UDP不足的功能呀;只是简单的实现了通过UDP进行主机/客户端的通信所以,虽然它完全是可以运行的,但在特定的网络拥塞或传输错误情况下,并不能保证主机和客户端进行正确的通信,还望兄弟在应用层面上加入诸如重发,计时等功能才行啊。模型就可以象这样,只是需要再加入相应的补充功能实现可靠传输!感谢你的帮忙,真的很感谢!望能尽快收到改进的版本这周末就要上交了呀!