刚学完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();
}
}
分享到:
相关推荐
本资源是使用 java,分别用 TCP 和 UDP 传输文件的源代码。读者朋友可以下载下来,参考着满足自己的需求。 另有博客《Java 使用 TCP 和 UDP 传输文件》可以参考,地址是:...
UDP传输的优点是快捷,因为它是没有安全保证的。有一定的丢失率。而且,由于各包的传输路径不同,后发送的包可能先于先发送的包到达。所以,如果发送大量的数据,就需要进行检错。当然,还得保证快捷的传输。 我就是...
本篇文章将深入探讨如何使用Java语言来实现UDP协议的文件传输。 首先,我们需要了解UDP的基本原理。UDP是一种无连接的传输层协议,它不保证数据的可靠传输,也不进行拥塞控制。这意味着数据包可能会丢失、重复或...
下面将详细探讨Android UDP传输的实现及其相关知识点。 首先,我们要了解在Android中如何创建UDP套接字。Android系统提供了`java.net.DatagramSocket`类来处理UDP通信。创建一个UDP套接字可以使用`DatagramSocket()...
"out_of_order_udp"是指在UDP传输中遇到的数据包乱序问题,"udp_reliable_java"是指在Java中实现UDP的可靠性,"udp_解决乱序"和"udp传输速率"则强调了在保证传输速率的同时解决数据包乱序的问题。 综上所述,实现...
2. 数据包编码和解码:在传输文件时,需要将文件内容分割成合适大小的数据报,并在接收端重新组合。 3. 错误检测和恢复:使用CRC(循环冗余校验)或其他校验和来检测数据错误,设计合理的重传策略来处理丢失的...
在Java中,可靠UDP传输可能涉及到以下关键概念和技术: 1. 数据报包的序列化和反序列化:将文件内容拆分成多个数据报包,并在接收端重组。 2. 错误检测与纠正:使用校验和或哈希值来检查数据的完整性和一致性。 3. ...
9. 编程语言实现:这可能涉及到使用如Python、C++、Java等编程语言实现UDP文件传输的客户端和服务器程序。 10. 常见问题处理:在实际应用中,可能会遇到网络延迟、丢包、乱序等问题,需要学习如何设计合适的解决...
1. **TCP与UDP传输** - **TCP(Transmission Control Protocol)**:是一种面向连接的、可靠的传输协议。在TCP中,数据会被分割成多个数据段,并为每个数据段分配序列号,确保数据能按顺序正确地到达目的地。TCP...
传输文件时,通常会涉及到文件的读取、数据包的构造、发送、接收、数据重组和写入等步骤。 为了在Java中实现文件传输,可以采用UDP协议或者TCP协议。TCP协议提供可靠的数据传输服务,能够保证数据的有序、可靠和无...
UDP是面向非连接的,UDP传输的是数据报只负责传输信息,不保证信息一定收到,虽然安全性不如TCP(面向连接、用Socket进行通信),但是性能较好。 从简单到复杂,首先简单介绍一下怎么利用UDP实现客服端发送消息给...
本项目“基于TCP/UDP的文件传输”着重探讨了如何利用这两种协议进行文件的可靠传输,特别是在实现UDP的可靠性方面。 TCP是一种面向连接的协议,它提供了可靠的、基于字节流的数据传输服务。TCP通过三次握手建立连接...
在安卓平台上进行UDP文件传输是一项常见的任务,尤其在设备间数据共享或小型网络游戏中非常有用。UDP(User Datagram Protocol)是一种无连接的、不可靠的传输协议,它以较小的开销提供快速的数据发送,但不保证...
标题中的"UDP.rar"指的是一个包含了使用UDP协议的Java程序的压缩文件,主要涉及的是UDP(User Datagram Protocol)在Java编程中的应用。UDP是一种无连接的传输层协议,相较于TCP,它提供了更低的延迟和更高的数据...
这两天下了一个使用UDP传输目录内文件的程序,发出来给大家一起看看,共同进步。有问题请指教。 由于udp丢包比较厉害,因此使用了自定义的内部协议,进行双方的确认。 程序跑起来后,看网络状况,有时候会一卡一卡的...
2. `UdpTool V1.0.jar`: 这是实际的Java UDP调试工具的可执行文件,它是一个JAR(Java Archive)包,包含了编译后的Java类和必要的资源文件。用户可以通过运行这个JAR文件来启动UDP调试工具。 3. `.myumldata`: 这...
在"Day9UDP"这个文件中,可能包含了关于如何实现Java UDP文件传输的详细步骤和代码示例,例如如何创建和使用DatagramSocket和DatagramPacket,以及如何处理文件的分块和重组。"www.pudn.com.txt"可能是介绍或补充这...
UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了快速、简单、不可靠的数据报服务。在处理网络通信时,NAT(Network Address Translation)技术被广泛应用于路由器上,用于将私有IP地址转换为公共...
在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源利用率的有效方法。多线程允许我们同时处理多个任务,这对于大文件传输或需要并行处理的场景尤其有用。本篇文章将深入探讨如何使用Java实现多...