论坛首页 Java企业应用论坛

UDP传输图片的尝试

浏览 16521 次
精华帖 (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)
 

 

 (900K)

 

 


通过比较可以看出但图片大小增大了以后失真就越明显,由此可见UDP传输不能保证文件的完整性。如果基于UDP的文传输要保证文件的完整性,者必须处理丢失或乱序的情况

  • 大小: 32.1 KB
  • 大小: 103.1 KB
  • 大小: 16.1 KB
  • 大小: 96 KB
  • 大小: 924.3 KB
  • 大小: 848 KB
   发表时间:2010-05-23  
楼主传的是jpg格式的图片,压缩过的格式。
传bmp的试试,可能出错点就不会影响其他点了。
0 请登录后投票
   发表时间:2010-05-23  
yunj 写道
楼主传的是jpg格式的图片,压缩过的格式。
传bmp的试试,可能出错点就不会影响其他点了。

我穿bmp格式的话图片显示不出来
0 请登录后投票
   发表时间:2010-05-24  
用SCTP协议传,有序的UDP协议:)
0 请登录后投票
   发表时间:2010-05-24  
那lz 用png的试试呢?? 应该不会有事了吧
0 请登录后投票
   发表时间:2010-05-24  
这测这有什么意义啊。

  • 大小: 19.5 KB
0 请登录后投票
   发表时间:2010-05-24  
校验md5码,不对就重新传,- -,不过貌似不人性化
0 请登录后投票
   发表时间:2010-05-24  
mathfox 写道
这测这有什么意义啊。


我只是验证下UDP传输文件的效果
0 请登录后投票
   发表时间:2010-05-24  
楼主至少要要排一下序吧,并且没有收到也要重发一下吧。
这样直接用收到的byte[]写入文件,肯定是不行的。
你这做的只是局域网的传输,一放外网,再小的图片也可能会错的。
要用UDP传递数据必须自己去实现丢包重发机制以及包的顺序问题。
0 请登录后投票
   发表时间:2010-05-24  
lbfhappy 写道
楼主至少要要排一下序吧,并且没有收到也要重发一下吧。
这样直接用收到的byte[]写入文件,肯定是不行的。
你这做的只是局域网的传输,一放外网,再小的图片也可能会错的。
要用UDP传递数据必须自己去实现丢包重发机制以及包的顺序问题。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics