《UDP协议实现二进制文件传输(java).doc》由会员分享,可在线阅读,更多相关《UDP协议实现二进制文件传输(java).doc(8页珍藏版)》请在金锄头文库上搜索。
1、1.UDP概念UDP 是User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。2.文件传输流程2.1在此使用UDP协议传送文件的程序中,先在服务器端设定监听端口号(3666),在接收客户端发来的请求之前一直处于阻塞状态;在客户端则从本地读取二进制文件并封装成数据报,并发送到相应的服务器端(ip:127.0.0.1,端口:3666);当服务器端接收到客户端发来的请求后,则对数据进行处理,即读取并保存数据,然后返回操作后的信息到客户端;当客户端接收
2、到服务器端的信息后,则输出服务器端返回的信息,到此时就完成了客户端的请求和服务器端的应答;最后关闭DatagramSocket。3.程序流程图Receive()接收到来自客户端的数据writeFile()Socket()readFile()sendTo()Receive()sendTo()客户端服务器端YN显示返回的信息Close()Socket()数据应答发送文件4.程序部分源码4.1 服务器端源码public class Server extends Thread DatagramSocket ds = null;DatagramPacket dp = null;File file = n
3、ull;Overridepublic void run() / TODO Auto-generated method stubtry / 设置端口为3666ds = new DatagramSocket(3666);while (true) byte buf = new byte1024 * 64;/ 用于接收长度为1024的数据包dp = new DatagramPacket(buf, buf.length);/ 从此套接字接收数据报包,此方法在接收到数据之前处于阻塞状态ds.receive(dp);/ 保存接收文件,文件名取系统当前时间long temp = System.currentT
4、imeMillis();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.printStackTra
5、ce();/* * 保存接收到的文件 * * 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);fileO
6、utputStream.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(filePath);ds = new DatagramSocket(6666);/ 封装数据报dp = new DatagramPacke
7、t(data, (int) data.length,InetAddress.getLocalHost(), 3666);/ 开始传输文件ds.send(dp);/ 接收从服务器回复的信息byte buf = new byte1024;dp = new DatagramPacket(buf, buf.length);ds.receive(dp);byte server = dp.getData();System.out.println(客户端-收到服务器返回的信息:n + new String(server,0,dp.getLength().trim(); catch (Exception e)
8、 e.printStackTrace(); finally ds.close();/* * 读取文件 * * param filePath * 文件路径 * return * throws IOException */public byte readFile(String filePath) throws IOException File file = new File(filePath);if (!file.exists() return null;InputStream inputStream = new FileInputStream(file);ByteArrayOutputStream out = new ByteArrayOutputStream(1024);byte data = new byte1024;int len = 0;while (len = inputStream.read(data) != -1) out.write(data, 0, len);byte ret = out.toByteArray();return ret;5.运行结果截图5.1服务器端开启后5.2 客户端启动后5.3客户端选择要发送的文件后5.4客户端点击“开始传送”按钮后5.4.1 服务器端显示5.4.2 客户端显示