`
woxiaoe
  • 浏览: 283531 次
  • 性别: 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的试试,可能出错点就不会影响其他点了。

相关推荐

    C#的Socket实现UDP协议通信

    这种特性使得UDP在数据传输速度和资源消耗上比TCP更优,适合于对实时性和速度有较高要求的应用场景,如在线视频、语音通话、游戏等。 ### C#中的Socket编程 在C#中,Socket编程主要用于网络通信,包括TCP和UDP。...

    socket实现jpg图片的传输

    而UDP虽然效率更高,但不保证数据包的顺序和丢失,因此不适合大文件如图片的传输。 此外,需要注意的是,由于JPEG图片文件是二进制数据,所以在传输过程中不能直接当作文本数据处理。客户端和服务器需要正确地处理...

    socket传输图片delphi代码例子

    本示例以"socket传输图片delphi代码例子"为主题,展示了如何使用Delphi进行Socket编程来实现在客户端和服务器之间发送和接收图片。 Delphi是一种强大的面向对象的编程环境,以其快速的编译器和直观的集成开发环境...

    mfc udp pictrans

    标题 "mfc udp pictrans" 暗示了一个基于MFC(Microsoft Foundation Classes)的应用程序,该程序利用UDP(User Datagram Protocol)协议进行图片的传输。MFC是微软提供的一套C++类库,用于构建Windows应用程序,它...

    使用winsock传输并显示图片

    本示例主题“使用Winsock传输并显示图片”聚焦于如何利用VC++(Microsoft Visual C++)这一强大的开发环境,通过Winsock库来实现在网络上的图像数据传输,并在接收端正确地显示这些图片。下面将详细介绍这一过程涉及...

    UDP远程监控系统.docx

    开发者尝试了JPG压缩算法,但未能找到一个在保持可接受清晰度的同时将图片大小压缩到64KB的解决方案。另一种方法是将图片数据分割成多个小于64KB的数据包,然后在接收端重新组装。然而,这种方法需要处理丢包问题,...

    Linux socket(套接字编程)编程 (图片 文字 文件传输

    UDP(User Datagram Protocol)则是无连接的,适合对实时性要求高的应用,但不保证数据的可靠传输。 **图片、文字、文件传输** 在Socket编程中,图片、文字和文件都可以视为二进制数据流进行处理。传输前,可能...

    unity实现Socket通讯(内含tcp粘包/拆包解决)

    UDP(User Datagram Protocol)是无连接的、不可靠的传输协议,但其广播特性非常适合服务发现。服务器通过UdpClient发送广播数据包,包含自身的IP地址,客户端接收到广播后,解析数据包获取服务器的IP,并使用TCP...

    局域网文件传输

    局域网文件传输是计算机网络中的一个重要应用,它允许连接在同一局域网(LAN)内的设备之间快速交换数据,如文件、图片、文档等。在实现这一功能时,通常会用到Socket编程技术,它是Internet协议族的一部分,为应用...

    socket_tran_linux.rar_Linux 传图片_socket 图片

    1. **文件读写**:在传输图片前,需要读取文件内容。使用`fopen()`、`fread()`和`fclose()`等函数读取图片文件。 2. **数据打包**:将读取到的图片数据转换为字节数组,以便通过socket传输。可以使用`malloc()`分配...

    windows下socket实例

    然后使用`socket()`函数创建一个Socket实例,指定协议类型(如TCP或UDP)、地址族(如AF_INET表示IPv4)和套接字类型(如SOCK_STREAM表示TCP)。 3. **服务器端编程**: - **绑定(Bind)**:使用`bind()`函数将...

    简易的socket聊天工具

    这个聊天工具支持发送文字和图片,意味着它可能采用了二进制流的方式传输图片数据,以确保图片在传输过程中不被破坏。 在实现过程中,通常会使用Python的`socket`模块,它是Python标准库的一部分。在服务器端,你...

    前端面试总结

    如果数据包在传输过程中丢失或损坏,UDP不会尝试重传。 - **高效性**: 由于UDP的轻量级特性,它在对实时性要求较高的应用场景中更为适用,例如在线游戏、视频会议等。 **联系**: - **同属于TCP/IP协议族**: TCP和...

    bcb实现 上传下载

    Indy是一个开源的网络应用组件,它涵盖了客户端和服务端的各种网络操作,如TCP、UDP和原始套接字。在BCB6中,安装Indy的步骤如下: A. 首先,如果已有旧版本的Indy,需要通过BCB的Modify选项删除。 B. 下载最新版的...

    Linux下网络编程服务器_客户端的C程序

    2. **地址族与套接字类型**: 创建套接字时,需要指定地址族(如AF_INET用于IPv4,AF_INET6用于IPv6)和套接字类型(如SOCK_STREAM用于TCP,SOCK_DGRAM用于UDP)。在示例中,可能使用了AF_INET和SOCK_STREAM,因为TCP...

    usbSoket.rar

    3. **USB Socket通信**:在Android和PC间通过USB进行Socket通信,是利用了USB接口的数据传输能力,结合TCP/IP或UDP/IP网络协议。Socket提供了一种进程间的通信机制,可以实现两台设备间的双向数据流。在这个案例中,...

    WebRTC (Web Real-Time Communications) 学习总结

    媒体数据(音频、视频等)使用Secure Real-time Transport Protocol (SRTP)传输,非媒体数据(如文本、图片等)则使用Stream Control Transmission Protocol (SCTP)传输。在传输层使用UDP协议,并通过DTLS协议确保...

    易语言网络与连接.pdf

    在现实生活中,一个大建筑可能有多个入口,计算机也是如此,它拥有不同类型的端口,包括物理端口(如USB、网线接口)和通信协议端口(如TCP或UDP端口)。这些端口用于不同硬件之间的连接和数据传输。 “连接( )”...

    西交15春《计算机应用基础》在线作业及满分答案.pdf

    “TCP/UDP”是传输控制协议(Transmission Control Protocol)和用户数据报协议(User Datagram Protocol)的缩写,两者都是互联网协议族中用于数据传输的协议。TCP是面向连接的、可靠的协议,而UDP是无连接的、不...

Global site tag (gtag.js) - Google Analytics