`
1320438999
  • 浏览: 127481 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

UDP传输文件(java)

阅读更多

刚学完Java,用UDP实现文件传输,实现有规律接收包。Java学得不是很好,希望高手看到指点一下。

还有部分代码未贴出,在下面附件中。

package com.way.server;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class Server extends Thread {
	private DatagramSocket receive;
	private String ip;
	private int serverPort;
	private int clientPort;
	private File file;
	private String path;
	private DatagramPacket pkg;
	private DatagramPacket messagepkg;


	public Server(String ip, int serverPort, int clientPort, String path) {
		super();
		this.ip = ip;
		this.serverPort = serverPort;
		this.clientPort = clientPort;
		this.path = path;
	}

	public String getPath() {
		return path;
	}

	public String getip() {
		return ip;
	}

	public void setPath(String path) {
		this.ip = path;
	}

	public File getFile() {
		return file;
	}

	public void setFile(File file) {
		this.file = file;
	}

	public void receive() {
		try {
			// 接收文件监听端口
			receive = new DatagramSocket(serverPort);
			// 写文件路径
			BufferedOutputStream bos = new BufferedOutputStream(
					new FileOutputStream(new File(path)));

			// 读取文件包
			byte[] buf = new byte[1024 * 63];
			pkg = new DatagramPacket(buf, buf.length);
			// 发送收到文件后 确认信息包
			byte[] messagebuf = new byte[1024];
			messagebuf = "ok".getBytes();
			messagepkg = new DatagramPacket(messagebuf, messagebuf.length,
					new InetSocketAddress(ip, clientPort));
			// 循环接收包,每接到一个包后回给对方一个确认信息,对方才发下一个包(避免丢包和乱序),直到收到一个结束包后跳出循环,结束文件传输,关闭流
			while (true) {
				receive.receive(pkg);
				if (new String(pkg.getData(), 0, pkg.getLength()).equals("end")) {
					System.out.println("文件接收完毕");
					bos.close();
					receive.close();
					break;
				}
				receive.send(messagepkg);
				System.out.println(new String(messagepkg.getData()));
				bos.write(pkg.getData(), 0, pkg.getLength());
				bos.flush();
			}
			bos.close();
			receive.close();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void run() {
		receive();
	}
}

 

package com.way.client;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class Client extends Thread {
	private DatagramSocket send;
	private DatagramPacket pkg;
	private DatagramPacket messagepkg;
	private int serverPort;
	private int clientPort;
	private String path;
	private File file;
	private String ip;


	public Client(int serverPort, int clientPort, String path, String ip) {
		super();
		this.serverPort = serverPort;
		this.clientPort = clientPort;
		this.path = path;
		this.ip = ip;
	}

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	public void send() {
		try {
			//文件发送者设置监听端口
			send = new DatagramSocket(clientPort);
			BufferedInputStream bis = new BufferedInputStream(
					new FileInputStream(new File(path)));
			//确认信息包
			byte[] messagebuf = new byte[1024];
			messagepkg = new DatagramPacket(messagebuf, messagebuf.length);
			//文件包
			byte[] buf = new byte[1024 * 63];
			int len;
			while ((len = bis.read(buf)) != -1) {
				
				pkg = new DatagramPacket(buf, len, new InetSocketAddress(
						ip, serverPort));
				//设置确认信息接收时间,3秒后未收到对方确认信息,则重新发送一次
				send.setSoTimeout(3000);
				while (true) {
					send.send(pkg);
					send.receive(messagepkg);
					System.out.println(new String(messagepkg.getData()));
					break;
				}
			}
			// 文件传完后,发送一个结束包
			buf = "end".getBytes();
			DatagramPacket endpkg = new DatagramPacket(buf, buf.length,
					new InetSocketAddress(ip, serverPort));
			System.out.println("文件发送完毕");
			send.send(endpkg);
			bis.close();
			send.close();

		} catch (SocketException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void run() {
		send();
	}
}

 

分享到:
评论
1 楼 yitianqq 2014-07-15  
下载的内容不对

相关推荐

    Java使用TCP和UDP传输文件的源代码

    本资源是使用 java,分别用 TCP 和 UDP 传输文件的源代码。读者朋友可以下载下来,参考着满足自己的需求。 另有博客《Java 使用 TCP 和 UDP 传输文件》可以参考,地址是:...

    基于UDP的Java大数据传输

    UDP传输的优点是快捷,因为它是没有安全保证的。有一定的丢失率。而且,由于各包的传输路径不同,后发送的包可能先于先发送的包到达。所以,如果发送大量的数据,就需要进行检错。当然,还得保证快捷的传输。 我就是...

    Java实现udp协议的文件传输

    本篇文章将深入探讨如何使用Java语言来实现UDP协议的文件传输。 首先,我们需要了解UDP的基本原理。UDP是一种无连接的传输层协议,它不保证数据的可靠传输,也不进行拥塞控制。这意味着数据包可能会丢失、重复或...

    android udp传输实例

    下面将详细探讨Android UDP传输的实现及其相关知识点。 首先,我们要了解在Android中如何创建UDP套接字。Android系统提供了`java.net.DatagramSocket`类来处理UDP通信。创建一个UDP套接字可以使用`DatagramSocket()...

    UDP.rar_UDP传文件_out of order udp_udp reliable java_udp 解决乱序_udp传输

    "out_of_order_udp"是指在UDP传输中遇到的数据包乱序问题,"udp_reliable_java"是指在Java中实现UDP的可靠性,"udp_解决乱序"和"udp传输速率"则强调了在保证传输速率的同时解决数据包乱序的问题。 综上所述,实现...

    UDP 文件传输 学习QQ文件传输

    2. 数据包编码和解码:在传输文件时,需要将文件内容分割成合适大小的数据报,并在接收端重新组合。 3. 错误检测和恢复:使用CRC(循环冗余校验)或其他校验和来检测数据错误,设计合理的重传策略来处理丢失的...

    udp.rar_UDP 文件 传输_file read_reliable udp java_udp 可靠传输_udp 文件传输

    在Java中,可靠UDP传输可能涉及到以下关键概念和技术: 1. 数据报包的序列化和反序列化:将文件内容拆分成多个数据报包,并在接收端重组。 2. 错误检测与纠正:使用校验和或哈希值来检查数据的完整性和一致性。 3. ...

    udp.zip_udp 文件传输

    9. 编程语言实现:这可能涉及到使用如Python、C++、Java等编程语言实现UDP文件传输的客户端和服务器程序。 10. 常见问题处理:在实际应用中,可能会遇到网络延迟、丢包、乱序等问题,需要学习如何设计合适的解决...

    java socket 大文件传输,快速传输(包的分片,组装)源码

    1. **TCP与UDP传输** - **TCP(Transmission Control Protocol)**:是一种面向连接的、可靠的传输协议。在TCP中,数据会被分割成多个数据段,并为每个数据段分配序列号,确保数据能按顺序正确地到达目的地。TCP...

    如何利用Java实现QQ文件传输功能

    传输文件时,通常会涉及到文件的读取、数据包的构造、发送、接收、数据重组和写入等步骤。 为了在Java中实现文件传输,可以采用UDP协议或者TCP协议。TCP协议提供可靠的数据传输服务,能够保证数据的有序、可靠和无...

    基于Java实现de UDP数据传输,双向传输,接收端和发送端,服务器

    UDP是面向非连接的,UDP传输的是数据报只负责传输信息,不保证信息一定收到,虽然安全性不如TCP(面向连接、用Socket进行通信),但是性能较好。 从简单到复杂,首先简单介绍一下怎么利用UDP实现客服端发送消息给...

    基于TCPUDP的文件传输

    本项目“基于TCP/UDP的文件传输”着重探讨了如何利用这两种协议进行文件的可靠传输,特别是在实现UDP的可靠性方面。 TCP是一种面向连接的协议,它提供了可靠的、基于字节流的数据传输服务。TCP通过三次握手建立连接...

    安卓 udp 文件传输入门版

    在安卓平台上进行UDP文件传输是一项常见的任务,尤其在设备间数据共享或小型网络游戏中非常有用。UDP(User Datagram Protocol)是一种无连接的、不可靠的传输协议,它以较小的开销提供快速的数据发送,但不保证...

    UDP.rar_UDP_java UDP聊天_udp java_udp java 服务_udp 聊天 java

    标题中的"UDP.rar"指的是一个包含了使用UDP协议的Java程序的压缩文件,主要涉及的是UDP(User Datagram Protocol)在Java编程中的应用。UDP是一种无连接的传输层协议,相较于TCP,它提供了更低的延迟和更高的数据...

    两台Android设备间通过UDP传送目录内的文件

    这两天下了一个使用UDP传输目录内文件的程序,发出来给大家一起看看,共同进步。有问题请指教。 由于udp丢包比较厉害,因此使用了自定义的内部协议,进行双方的确认。 程序跑起来后,看网络状况,有时候会一卡一卡的...

    JAVA Udp调试工具 Java版本

    2. `UdpTool V1.0.jar`: 这是实际的Java UDP调试工具的可执行文件,它是一个JAR(Java Archive)包,包含了编译后的Java类和必要的资源文件。用户可以通过运行这个JAR文件来启动UDP调试工具。 3. `.myumldata`: 这...

    UDP.rar_JAVA UDP_UDP 鏂囦欢浼犺緭_java 文件传输_udp ja

    在"Day9UDP"这个文件中,可能包含了关于如何实现Java UDP文件传输的详细步骤和代码示例,例如如何创建和使用DatagramSocket和DatagramPacket,以及如何处理文件的分块和重组。"www.pudn.com.txt"可能是介绍或补充这...

    Java实现UDP穿透NAT技术

    UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了快速、简单、不可靠的数据报服务。在处理网络通信时,NAT(Network Address Translation)技术被广泛应用于路由器上,用于将私有IP地址转换为公共...

    java实现多线程文件传输

    在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源利用率的有效方法。多线程允许我们同时处理多个任务,这对于大文件传输或需要并行处理的场景尤其有用。本篇文章将深入探讨如何使用Java实现多...

Global site tag (gtag.js) - Google Analytics