`
woxiaoe
  • 浏览: 276719 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

UDP传输图片的尝试

    博客分类:
  • Java
阅读更多

 

 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的文传输要保证文件的完整性,者必须处理丢失或乱序的情况

  • 大小: 32.1 KB
  • 大小: 103.1 KB
  • 大小: 16.1 KB
  • 大小: 96 KB
  • 大小: 924.3 KB
  • 大小: 848 KB
分享到:
评论
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发送文件,理论上是有可能发生丢包的情况,但是如果协议制定的好这种情况是可以避免的。
12 楼 mikehuhu 2010-05-24  
是不是在本机或内网测试的,这个顺序一般不会乱吧
11 楼 strongkill 2010-05-24  
真的没有多大意思.
1,UDP肯定会掉包.
2,做一个验证重发机制,UDP就可以默认为可靠了.
3,UDP在某些地比TCP优秀~
10 楼 石中玉 2010-05-24  
woxiaoe 写道
mathfox 写道
这测这有什么意义啊。


我只是验证下UDP传输文件的效果


真无聊...
9 楼 peacenik 2010-05-24  
lbfhappy 写道
楼主至少要要排一下序吧,并且没有收到也要重发一下吧。
这样直接用收到的byte[]写入文件,肯定是不行的。
你这做的只是局域网的传输,一放外网,再小的图片也可能会错的。
要用UDP传递数据必须自己去实现丢包重发机制以及包的顺序问题。

8 楼 lbfhappy 2010-05-24  
楼主至少要要排一下序吧,并且没有收到也要重发一下吧。
这样直接用收到的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格式的话图片显示不出来
1 楼 yunj 2010-05-23  
楼主传的是jpg格式的图片,压缩过的格式。
传bmp的试试,可能出错点就不会影响其他点了。

相关推荐

    java源码包---java 源码 大量 实例

    本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...

    java源码包2

    本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...

    java源码包3

    本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...

    java源码包4

    本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统...

    JAVA上百实例源码以及开源项目源代码

    本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...

    JAVA上百实例源码以及开源项目

    本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取...

Global site tag (gtag.js) - Google Analytics