第二步:实现文件传递。
上一步只是从服务端传递了一个字符串到客户端,这次需要对代码进行调整,实现从服务端获取文件,在客户端将文件存入目标地址。
调整后的代码:
服务端:
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,端口号使用36000serverSocket = 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类型的字节流可以根据信息类型分别进行处理。