自己用java实现飞鸽传书 2 - 实现文件传输
第二步:实现文件传递。
上一步只是从服务端传递了一个字符串到客户端,这次需要对代码进行调整,实现从服务端获取文件,在客户端将文件存入目标地址。
调整后的代码:
服务端:
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args){ //创建服务端socket,用以网络信息的接收 ServerSocket serverSocket = null; try { //服务端socket使用本地IP,端口号使用36000 serverSocket = new ServerSocket(36000); //保证服务端持续运行 while(true){ //接收网络信息,未接收到则阻塞当前线程 Socket socket = serverSocket.accept(); //将文件信息写入socket通信 writeFile(socket); //关闭socket,防止客户端长时间等待 socket.close(); } } catch (Exception e) { e.printStackTrace(); } } /** * 将文件信息写入socket通信流 * @param socket * socket */ private static void writeFile(Socket socket){ try{ //获取本地文件 String filePath ="D:/test.pdf"; //创建文件对象 File file = new File(filePath); //使用DataOutputStream传送文件信息 DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); //写入文件名 dos.writeUTF(file.getName()); //写入文件大小 dos.writeLong(file.length()); //清空缓冲区 dos.flush(); //使用DataInputStream将文件写入 DataInputStream dis = new DataInputStream( new FileInputStream(file) ); byte[] buffer = new byte[1024]; int head = 0; while((head=dis.read(buffer)) > 0){ dos.write(buffer, 0, head); } dis.close(); dos.close(); }catch(Exception e){ e.printStackTrace(); } } }
客户端:
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileOutputStream; import java.net.Socket; public class Client { public static void main(String[] args){ DataInputStream input = null; Socket clientSocket = null; try { //创建客户端socket,用以连接服务端 clientSocket = new Socket("127.0.0.1", 36000); //读取服务端发送的信息流 input = new DataInputStream(clientSocket.getInputStream()); String fileName = input.readUTF(); long fileSize = input.readLong(); System.out.println("收到服务端发过来的文件,文件名称为:" + fileName + ",文件大小为:" + fileSize); //将文件读入本地 String savePath = "E:\\just a test.pdf"; DataOutputStream fos = new DataOutputStream(new FileOutputStream(savePath)); byte[] buffer = new byte[1024]; int head = 0; while((head=input.read(buffer)) > 0){ fos.write(buffer, 0, head); } fos.close(); input.close(); clientSocket.close(); } catch (Exception e) { e.printStackTrace(); } } }
本次文件流的传送使用了DataOutputStream和DataInputStream,使用Data类型的字节流可以根据信息类型分别进行处理。
仅是学习笔记,难免出错,望不吝指点