急急急:各位务必要帮这个忙,分数不是问题!!! bluesmile979(笑着) TCP/IP 只有四层的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不过假如你真的实现了>在应用层有相应的诸如通讯握手,错误重发,超时重发等等和可靠数据传输相关的TCP特性这和 TCP 本身又有什么区别呢?只不过是在不同的地方实现罢了 实际上tcp/ip和OSI协议中其中一点不同就是tcp/ip协议网络层是不可靠的,没有实现面向连接的可靠传输,可靠传输是使用在传输层的tcp协议,现在楼主想用udp协议实现传输在应用层进行可靠性控制,对程序来说增加了处理的工作量,但也增加了程序灵活性(当然也要看程序中是否需要使用这种灵活性). 实时系统为考虑实时性,经常用UDP协议 要实现可靠的udp信息发送可以这样处理1将你要发送的数据以500个字节进行分包。2在每个包的头部加上序列号,这样每个字节包在512个字节范围内。3服务器接收到这种按序列分割的包后按照序列组装起来,如果其中有哪个序列丢失再要求客户重新发送。不过正如 telenths(_非法操作_)所说的,这样比较象tcp连接了,同时你的编码量比较大 谢谢各位的支持,我只是想实现通过UDP的可靠传输;换句话说就是通过在应用层建立相应的需要TCP才能实现的功能!不知哪位高手愿意拿出一个源码,我们大家都好好学习学习啊!这样也可以对网络的层次结构有更清晰的认识!谢谢以上的各位热心朋友啊 我想基本的手段就是超时重发吧,还有就是接收端反馈ACK,吧,但是超时的时间是多少,定义ACK 倒是蛮麻烦的呢..学习啊 还是感觉没什么实际的意义TO非法:哦,没注意,把OSI参考模型写上去了。THX:) 不过意思差不多啦,我还是习惯7层的分法。 我想其实你就要对那个dataprampacket那个对数据打包的类进行扩展(如数据包的序号)...然后客户和服务器端建立一个通讯机制(规则) 你可以把你的数据在应用层进行打包吗!打包方式可以参考TCP这样做好像对处理性能的要求要很高诶!!速度会很慢!!! 一个例子 先执行 Server 在执行 Client//UDPServer.javaimport 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.javaimport 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进行主机/客户端的通信所以,虽然它完全是可以运行的,但在特定的网络拥塞或传输错误情况下,并不能保证主机和客户端进行正确的通信,还望兄弟在应用层面上加入诸如重发,计时等功能才行啊。模型就可以象这样,只是需要再加入相应的补充功能实现可靠传输!感谢你的帮忙,真的很感谢!望能尽快收到改进的版本这周末就要上交了呀! 异异异...异常来袭:java.sql.SQLException: Incorrect string value: '\xE3\x80\x90\xE9\x80\ 何时用FileInputStream 问个很菜的问题?请指教 jdom的中文问题 如何用程序去控制类似于QQ的登陆按钮 在JB中运行一个类很难吗?真不明白。 关于动态加载组件的问题。 关于jboss的jms配置与使用问题。有参与就给分!!! 见笑了 Method的调用方法,by reference or by value 老大,救救我!!!! 问大家一个关于"时间"小问题(希望速答)
>在应用层有相应的诸如通讯握手,错误重发,超时重发等等和可靠数据传输相关的TCP特性
这和 TCP 本身又有什么区别呢?
只不过是在不同的地方实现罢了
1将你要发送的数据以500个字节进行分包。
2在每个包的头部加上序列号,这样每个字节包在512个字节范围内。
3服务器接收到这种按序列分割的包后按照序列组装起来,如果其中有哪个序列丢失再要求客户重新发送。不过正如 telenths(_非法操作_)所说的,这样比较象tcp连接了,同时你的编码量比较大
//UDPServer.javaimport 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.javaimport 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){} }}