1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 基于UDP的简单文件传输

基于UDP的简单文件传输

时间:2023-09-01 11:01:45

相关推荐

基于UDP的简单文件传输

利用udp来传输小文件

首先运行服务器端,然后运行客户端。客户端里面有写死的文件路径,启动后就会向服务器端输出。服务器端进行数据接收,然后程序结束。

1.服务器端

1.DatagramSocket 类表示用于发送和接收数据报包的套接字。它的receive()方法可以接受数据报包,然后数据报包再把数据输出出来。

receive()方法介绍:从此套接字接收数据报包。当此方法返回时,DatagramPacket的缓冲区将被接收到的数据填充。 此方法将阻塞,直到接收到数据报为止。数据报包对象有一个length字段包含接收到的消息的长度。

2.DatagramPacket 类表示数据报包。它的getData()方法可以把数据取出来

getData()方法介绍:返回数据缓冲区的数据。

import java.io.*;import .DatagramPacket;import .DatagramSocket;/*** DatagramSocket 类用于表示发送和接收数据报包的套接字。* DatagramPacket 类用来表示数据报包。* */public class UDPServlet {public static void main(String[] args) {try {System.out.println("服务器已经启动。。。。");//服务器端。DatagramSocket 类用于表示发送和接收数据报包的套接字DatagramSocket servlet = new DatagramSocket(8888);//接收的容器byte[] bytes = new byte[1024*10];//new InetSocketAddress("localhost",7890) 是创建制定主机名和端口的套接字。装到DatagramPacket数据报包里面去里面去。DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);servlet.receive(packet);byte[] data = packet.getData();System.out.println("包接收过来的数据长度 : "+data.length);IOUtils.ArrayToFile(data,"D:/006copy.png");servlet.close();System.out.println("服务器已经关闭");} catch (IOException e) {e.printStackTrace();}}}

2.客户端

1.注意DatagramPacket的构造方法。与服务器段不同的是,它需要传参数,以便于确定将数据发送到哪里。

public DatagramPacket(byte buf[], int offset, int length, SocketAddress address) {

}

构造一个数据报包,以发送偏移量为多少,到指定主机上的指定端口号,长度为多少的数据包。 对应构造方法的后两个参数,一般偏移量从0开始,也就是数据的开始,而长度为发送数据的长度,两个数字代表发送完整的数据。

需要注意构造器的第四个参数,SocketAddress address。SocketAddress 类是一个抽象类。此时传入的是它的子类InetSocketAddress。

InetSocketAddress类继承了SocketAddress ,此类实现IP套接字地址,可以是(IP地址+端口号)也可以是一对(主机名+端口号)。

这样便表示了数据的流向。

import java.io.*;import .*;public class UDPClient {public static void main(String[] args) {try {System.out.println("客户端已经启动。。。。");//DatagramSocket client = new DatagramSocket(9999);//文件的字节数据数组byte[] sendData = IOUtils.FileToArray("D:/006.png");//封装数据DatagramPacket packet = new DatagramPacket(sendData,0,sendData.length,new InetSocketAddress("localhost",8888));client.send(packet);client.close();System.out.println("客户端已经关闭");} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}

3.IOUtils工具类

import java.io.*;public class IOUtils {/*public static void main(String[] args) {byte[] bytes = FileToArray("D:/006.png");ArrayToFile(bytes,"D:/006copy.png");System.out.println("--");}*///字节数组输入流和字节流的配合。字节数组输入流读到临时数组,再由字节输出流输出到指定路径public static void ArrayToFile(byte[] bytes,String copyPath){//Files.readAllBytes();System.out.println(bytes.length);ByteArrayInputStream bis = null;OutputStream os = null;try{File file = new File(copyPath);bis = new ByteArrayInputStream(bytes);os = new FileOutputStream(file);int read;byte[] temp = new byte[1024];while (-1 != (read = bis.read(temp))){os.write(temp);}os.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {if (null!=os && null!=bis){os.close();bis.close();}} catch (IOException e) {e.printStackTrace();}}}//字节数组输出流和字节流的配合。文件现由字节输入流读进去,再有字节数组输出流输出为数组public static byte[] FileToArray(String path){byte[] fileBytes = null;ByteArrayOutputStream bos = null;InputStream is = null;try{File file = new File(path);if (!file.exists()){file.createNewFile();}bos = new ByteArrayOutputStream();is = new FileInputStream(file);byte[] temp = new byte[1024*100];int num;while(-1 != (num = is.read(temp))){bos.write(temp,0,num);}bos.flush();fileBytes = bos.toByteArray();}catch (IOException e) {e.printStackTrace();}finally {try {if (null != is && null != bos){is.close();bos.close();}} catch (IOException e) {e.printStackTrace();}}return fileBytes;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。