一、客户端代码
要点:文件上传式,未将文件结束标志上传到服务器,会导致服务端写入文件死循环,客户端需要使用socket.shutdownOutput(),结束上传流。
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /* 文件上传客户端 */ public class demo_TCPClient { public static void main(String[] args) throws IOException { // 定义需要上传的本地文件 FileInputStream fis = new FileInputStream("D:\\客户端文件\\in.txt"); // 创建服务器连接 Socket socket = new Socket("127.0.0.1", 8080); // 获取一个上传流 OutputStream outputStream = socket.getOutputStream(); // 遍历输出本地文件到上传流 // 定义存放读取数据的字节数组 byte[] bytes = new byte[1024]; // 定义读取的有效字节数 int len=0; // 遍历出本地文件到上传流 while ((len=fis.read(bytes))!=-1){ outputStream.write(bytes,0,len); } // 关闭上传流,避免IO阻塞 socket.shutdownOutput(); // 关闭本地文件流 fis.close(); // 获取服务器返回信息 InputStream inputStream = socket.getInputStream(); // 将获取到的信息遍历出 while ((len=inputStream.read(bytes))!=-1){ System.out.println(new String(bytes,0,len)); } // 关闭获取信息流 socket.shutdownInput(); // 关闭服务器连接 socket.close(); } }
二、服务端
要点:服务器使用多线程应对不同客户并发请求,对产生的IOException使用try catch捕获异常。
import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Random; /* 文件上传服务端 */ public class demo_TCPServer { public static void main(String[] args) throws IOException { // 创建一个服务器对象 ServerSocket serverSocket = new ServerSocket(8080); // 获取连接信息 while (true) { Socket accept = serverSocket.accept(); // 开启多线程服务 new Thread(() -> { try { // 创建服务器接收文件目录对象 File file = new File("D:\\服务端文件"); // 如果该目录不存在,则创建该目录 if (!file.exists()) { file.mkdirs(); } // 定义文件保存路径,保证多用户同时请求,文件名称不冲突 String src = file + "//" + System.currentTimeMillis() + (new Random(9999).nextInt()) + ".txt"; // 定义服务器文件输入字节流 FileOutputStream fileOutputStream = new FileOutputStream(src); // 获取客户端输入 InputStream inputStream = accept.getInputStream(); // 遍历客户端输入 byte[] bytes = new byte[1024]; int len = 0; while ((len = inputStream.read(bytes)) != -1) { // 将获取的文件输出到服务器 fileOutputStream.write(bytes, 0, len); } // 关闭服务器输入流 accept.shutdownInput(); // 给客户端应答 OutputStream outputStream = accept.getOutputStream(); outputStream.write("文件上传成功".getBytes()); accept.shutdownOutput(); } catch (IOException o) { System.out.println(o); } finally { try { accept.close(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } } }