- 浏览: 276719 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
CodeLove:
如果包含<,(,)...等特殊字符呢
Python变量名检测 -
zlxzlxzlxzlxzlx:
这不能算是任意进制之间的转换,只能算是 2、8、10、16 几 ...
java实现的任意进制转换 -
mychaoyue2011:
在本地执行了几遍,结果都是:s2开始休眠s1开始休眠s2休眠结 ...
Java线程学习笔记(四)线程join -
chxiaowu:
不错!
Java版的树 -
TenAclock:
这个例子 做不到“学生都交完” 考试结束,只能做到等到考试时间 ...
Java线程学习笔记(十一) DelayQueue的应用
UDP是不可靠的,发送的数据不一定会到达,且顺序不一定完整。
想要验证一下UDP传输文件的效果,最直观的是传输图片。
这里在客户端的DatagramSocket设置了个超时时间,当发送端发送完后客户端就会抛出超时异常,程序就退出了。
UDPFileReceiver:
package com.woxiaoe.study.java_net.udp; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UDPFileReceiver { private int port = 1220; private DatagramSocket socket; public UDPFileReceiver() throws SocketException{ socket = new DatagramSocket(port); socket.setSoTimeout(4000); } public void reciveData() throws FileNotFoundException{ File newfile = new File("641k.jpg"); byte[] buf = new byte[8192]; FileOutputStream fos = new FileOutputStream(newfile); while(true){ DatagramPacket packet = new DatagramPacket(buf, 8192); try{ socket.receive(packet); fos.write(packet.getData(), 0, packet.getLength()); }catch(Exception e){ try { System.out.println("传输结束"); socket.close(); fos.flush(); fos.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } break; } } } public static void main(String[] args) throws FileNotFoundException, SocketException { new UDPFileReceiver().reciveData(); } }
UDPFileServer:
package com.woxiaoe.study.java_net.udp; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class UDPFileServer { private int port = 1220; private String filePath = ""; private DatagramSocket socket; public UDPFileServer() throws SocketException { socket = new DatagramSocket(); //System.out.println("服务器启动成功"); } public void service() throws IOException{ InputStream is = this.getClass().getResourceAsStream("641k.jpg"); byte[] buffer = new byte[8192]; int len = 0; while((len = is.read(buffer)) != -1){ System.out.println(len); DatagramPacket packet = new DatagramPacket(buffer, len,InetAddress.getByName("localhost"),port); socket.send(packet); } socket.close(); } public static void main(String[] args) throws SocketException, IOException { new UDPFileServer().service(); } }
原图片 和 传输后的图片对比
(32K)
(100K)
(900K)
通过比较可以看出但图片大小增大了以后失真就越明显,由此可见UDP传输不能保证文件的完整性。如果基于UDP的文传输要保证文件的完整性,者必须处理丢失或乱序的情况
评论
17 楼
kimmking
2010-09-13
自定义传输格式:
分片
每片编号
客户端记录收到的片段
最后再请求未收到的
分片
每片编号
客户端记录收到的片段
最后再请求未收到的
16 楼
沈冠军
2010-09-13
用tcp来应该不会出现这个现象吧
15 楼
psuqqvfp
2010-05-26
udp本身就是不可靠的,建议用 sctp 传
14 楼
jitabc
2010-05-25
可以试试jdk 7中的com.sun.nio.sctp
13 楼
fjlyxx
2010-05-25
呵呵,LZ是你代码问题导致丢包的。UDP在某些方面还是很有用的,特别是局域网内的通信。
比如要做一个局域网内无中心服务器的聊天系统,那么UDP完全可以作为建立在线用户列表(往255发上线下线包)以及传输消息的协议(往固定IP发消息包)。UDP基本上需要回复包。
用UDP发送文件,理论上是有可能发生丢包的情况,但是如果协议制定的好这种情况是可以避免的。
比如要做一个局域网内无中心服务器的聊天系统,那么UDP完全可以作为建立在线用户列表(往255发上线下线包)以及传输消息的协议(往固定IP发消息包)。UDP基本上需要回复包。
用UDP发送文件,理论上是有可能发生丢包的情况,但是如果协议制定的好这种情况是可以避免的。
12 楼
mikehuhu
2010-05-24
是不是在本机或内网测试的,这个顺序一般不会乱吧
11 楼
strongkill
2010-05-24
真的没有多大意思.
1,UDP肯定会掉包.
2,做一个验证重发机制,UDP就可以默认为可靠了.
3,UDP在某些地比TCP优秀~
1,UDP肯定会掉包.
2,做一个验证重发机制,UDP就可以默认为可靠了.
3,UDP在某些地比TCP优秀~
10 楼
石中玉
2010-05-24
woxiaoe 写道
mathfox 写道
这测这有什么意义啊。
我只是验证下UDP传输文件的效果
真无聊...
9 楼
peacenik
2010-05-24
lbfhappy 写道
楼主至少要要排一下序吧,并且没有收到也要重发一下吧。
这样直接用收到的byte[]写入文件,肯定是不行的。
你这做的只是局域网的传输,一放外网,再小的图片也可能会错的。
要用UDP传递数据必须自己去实现丢包重发机制以及包的顺序问题。
这样直接用收到的byte[]写入文件,肯定是不行的。
你这做的只是局域网的传输,一放外网,再小的图片也可能会错的。
要用UDP传递数据必须自己去实现丢包重发机制以及包的顺序问题。
8 楼
lbfhappy
2010-05-24
楼主至少要要排一下序吧,并且没有收到也要重发一下吧。
这样直接用收到的byte[]写入文件,肯定是不行的。
你这做的只是局域网的传输,一放外网,再小的图片也可能会错的。
要用UDP传递数据必须自己去实现丢包重发机制以及包的顺序问题。
这样直接用收到的byte[]写入文件,肯定是不行的。
你这做的只是局域网的传输,一放外网,再小的图片也可能会错的。
要用UDP传递数据必须自己去实现丢包重发机制以及包的顺序问题。
7 楼
woxiaoe
2010-05-24
mathfox 写道
这测这有什么意义啊。
我只是验证下UDP传输文件的效果
6 楼
dieslrae
2010-05-24
校验md5码,不对就重新传,- -,不过貌似不人性化
5 楼
mathfox
2010-05-24
这测这有什么意义啊。
4 楼
whaosoft
2010-05-24
那lz 用png的试试呢?? 应该不会有事了吧
3 楼
myreligion
2010-05-24
用SCTP协议传,有序的UDP协议:)
2 楼
woxiaoe
2010-05-23
yunj 写道
楼主传的是jpg格式的图片,压缩过的格式。
传bmp的试试,可能出错点就不会影响其他点了。
传bmp的试试,可能出错点就不会影响其他点了。
我穿bmp格式的话图片显示不出来
1 楼
yunj
2010-05-23
楼主传的是jpg格式的图片,压缩过的格式。
传bmp的试试,可能出错点就不会影响其他点了。
传bmp的试试,可能出错点就不会影响其他点了。
发表评论
-
Consider the following code: What will be printed?
2010-09-24 20:30 940Consider the following code: Wh ... -
Java 基础复习笔记一
2010-06-04 02:03 1112这两天复习java的基础知识,把一些自己认为比较有用的点记录下 ... -
Java 转义字符
2010-06-03 21:21 977\n 回车(\u000a) \t 水平制表符(\u0009) ... -
生产消费者的模拟
2010-05-27 23:16 1632采用Java 多线程技术,设计实现一个符合生产者和消费者问题的 ... -
Java 控制台下显示文件结构
2010-05-27 00:10 3237题目: 编写一个Java ... -
Java得到类目录
2010-05-26 23:22 1159String path = MainTest.class.ge ... -
Java文件压缩
2010-05-23 21:54 1201package com.woxiaoe.study.io ... -
【转载】Java String.Format() 方法及参数说明
2010-05-15 22:18 1303JDK1.5中,String类新增了一个很有用的静态方法S ... -
【转载】String.format函数使用方法介绍
2010-05-15 22:17 1169http://edu.codepub.com/2009/111 ... -
Java线程学习笔记(十一) DelayQueue的应用
2010-05-01 00:34 15587DelayQueue 是一个无界的BlockingQueue ... -
Java线程学习笔记(十)CountDownLatch 和CyclicBarrier
2010-04-30 21:04 2789CountDownLatch : 一个同步辅助类,在完成一组 ... -
Java线程学习笔记(九)生产者消费者问题
2010-04-29 22:27 1693用多线程来模拟生产者消费者问题。用到BlockingQueue ... -
Java线程学习笔记(八)线程之间的协作
2010-04-26 23:13 1759wait()与notifyAll() 调用sleep ... -
Java线程学习笔记(七)java中递增不是原子性
2010-04-24 23:00 2895以下为测试代码,通过一个自增函数得到最新的值,玩Set你存,看 ... -
Java线程学习笔记(六)在其他对象上同步
2010-04-24 22:47 1337package com.woxiaoe.study.threa ... -
Java线程学习笔记(五)资源共享问题
2010-04-24 21:04 1250IncreaseClient 中持有一个base,每次调用起i ... -
Java线程学习笔记(四)线程join
2010-04-24 20:06 1264《Java编程思想》的一个例子,如果某个线程在另一个线程t上调 ... -
基于java的图(四) 强连通组件
2010-04-22 21:06 1525有向图中, u可达v不一定意味着v可达u. 相互可达则属于同一 ... -
基于java的图(三) 图的拓扑排序
2010-04-21 16:14 1854相关: 基于java的图的实现 基于java ... -
基于java的图的实现(二) 图的两种遍历
2010-04-20 21:51 2084图的实现见http://www.iteye.com/topic ...
相关推荐
本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...
本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...
本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...
本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...
本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统...
本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统...
本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...
本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...