1.UDP概念
UDP 是User Datagram Protocol的简称, 中文名是用户 数据包协议,是 OSI 参考模型中一种无连接的 传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。
2.文件传输流程
2.1在此使用UDP协议传送文件的程序中,先在服务器端设定监听端口号(3666),在接收客户端发来的请求之前一直处于阻塞状态;在客户端则从本地读取二进制文件并封装成数据报,并发送到相应的服务器端(ip:127.0.0.1,端口:3666);当服务器端接收到客户端发来的请求后,则对数据进行处理,即读取并保存数据,然后返回操作后的信息到客户端;当客户端接收到服务器端的信息后,则输出服务器端返回的信息,到此时就完成了客户端的请求和服务器端的应答;最后关闭DatagramSocket。
3.程序流程图
Receive()
Receive()
接收到来自客户端的数据
writeFile()
Socket()
readFile()
sendTo()
Receive()
sendTo()
客户端
服务器端
Y
N
显示返回的信息
Close()
Socket()
数据应答
发送文件
4.程序部分源码
4.1 服务器端源码
public class Server extends Thread {
DatagramSocket ds = null;
DatagramPacket dp = null;
File file = null;
@Override
public void run() {
// TODO Auto-generated method stub
try {
// 设置端口为3666
ds = new DatagramSocket(3666);
while (true) {
byte[] buf = new byte[1024 * 64];
// 用于接收长度为1024的数据包
dp = new DatagramPacket(buf, buf.length);
// 从此套接字接收数据报包,此方法在接收到数据之前处于阻塞状态
ds.receive(dp);
// 保存接收文件,文件名取系统当前时间
long temp = System.currentTimeMillis();
this.saveFile(dp, temp + "");
// 为使反馈过程效果明显,线程休眠2秒后发送回复信息
Thread.sleep(2000);
String message = "server has received it.";
DatagramPacket packet = new DatagramPacket(message.getBytes(),
message.length(), InetAddress.getLocalHost(), 6666);
// 发送回复数据包
ds.send(packet);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 保存接收到的文件
*
* @param dp
* @param filePath 保存文件所在的路径
* @throws IOException
*/
private void saveFile(DatagramPacket dp, String filePath)
throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream(new File(
filePath));
fileOutputStream.write(dp.getData(), 0, dp.getData().length);
fileOutputStream.close();
}
}
4.2客户端源码
public class Client {
private DatagramSocket ds = null;
private DatagramPacket dp = null;
/**
* 传输文件
* @param filePath 文件所在路径
*/
public void TransmitFile(String filePath) {
try {
// 从本地读取文件
byte[] data = this.readFile(