锁定老帖子 主题:UDP传输图片的尝试
精华帖 (0) :: 良好帖 (1) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-05-22
最后修改:2010-05-22
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)
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-05-23
楼主传的是jpg格式的图片,压缩过的格式。
传bmp的试试,可能出错点就不会影响其他点了。 |
|
返回顶楼 | |
发表时间:2010-05-23
yunj 写道 楼主传的是jpg格式的图片,压缩过的格式。
传bmp的试试,可能出错点就不会影响其他点了。 我穿bmp格式的话图片显示不出来 |
|
返回顶楼 | |
发表时间:2010-05-24
用SCTP协议传,有序的UDP协议:)
|
|
返回顶楼 | |
发表时间:2010-05-24
那lz 用png的试试呢?? 应该不会有事了吧
|
|
返回顶楼 | |
发表时间:2010-05-24
这测这有什么意义啊。
|
|
返回顶楼 | |
发表时间:2010-05-24
校验md5码,不对就重新传,- -,不过貌似不人性化
|
|
返回顶楼 | |
发表时间:2010-05-24
mathfox 写道 这测这有什么意义啊。
我只是验证下UDP传输文件的效果 |
|
返回顶楼 | |
发表时间:2010-05-24
楼主至少要要排一下序吧,并且没有收到也要重发一下吧。
这样直接用收到的byte[]写入文件,肯定是不行的。 你这做的只是局域网的传输,一放外网,再小的图片也可能会错的。 要用UDP传递数据必须自己去实现丢包重发机制以及包的顺序问题。 |
|
返回顶楼 | |
发表时间:2010-05-24
lbfhappy 写道 楼主至少要要排一下序吧,并且没有收到也要重发一下吧。
这样直接用收到的byte[]写入文件,肯定是不行的。 你这做的只是局域网的传输,一放外网,再小的图片也可能会错的。 要用UDP传递数据必须自己去实现丢包重发机制以及包的顺序问题。 |
|
返回顶楼 | |