Java C-S 模式实现文件的网络传输,从客户端发送文件到服务器端,服务器端接收文件下载保存到本地并反馈消息给客户端。
import java.io.*; import java.net.InetAddress; import java.net.Socket; /** * 客户端:将文件发送到服务器端,并接收服务器发送的反馈信息 * * @author Spring-_-Bear * @version 2021-11-01 20:24 */ public class FileSendClient { public static void main(String[] args) { Socket socket = null; InputStream inputStream = null; OutputStream outputStream = null; BufferedReader bufferedReader = null; BufferedInputStream bufferedInputStream = null; ByteArrayOutputStream byteArrayOutputStream = null; try { // 读取到的字节数 int readLen; // 文件大小 int fileSize = 0; // 字节缓冲数组,加快文件读取速度 byte[] buffer = new byte[1024]; // 文件路径 File filePath = new File("C:\\Users\\Admin\\Desktop\\BeFree.jpg"); // 创建字节输出流,保存从文件读取到的二进制数据 byteArrayOutputStream = new ByteArrayOutputStream(); // 文件输入流 bufferedInputStream = new BufferedInputStream(new FileInputStream(filePath)); // 读取图片文件中的二进制内容,并将内容写进字节数组输出流 System.out.println("文件读入中···"); while ((readLen = bufferedInputStream.read(buffer)) != -1) { // 将从文件读取到的二进制数据写进字节数组输出流(byteArrayOutputStream) byteArrayOutputStream.write(buffer, 0, readLen); fileSize += readLen; } System.out.println("文件读入成功,文件大小为:" + fileSize + " bytes!"); // 将得到的 byteArrayOutputStream 转换为一个字符数组 byte[] array = byteArrayOutputStream.toByteArray(); // 与服务器端建立连接 socket = new Socket(InetAddress.getLocalHost(), 6666); // 获取输出流,将图片字节数组发送到服务器端 outputStream = socket.getOutputStream(); System.out.println("文件发送到服务器中···"); outputStream.write(array); // 写入结束标志 socket.shutdownOutput(); System.out.println("文件发送到服务器成功!"); // 接送服务器端发送的反馈信息并打印 System.out.print("接收到的服务器信息:"); inputStream = socket.getInputStream(); bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); System.out.println(bufferedReader.readLine()); } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); inputStream.close(); outputStream.close(); bufferedReader.close(); bufferedInputStream.close(); byteArrayOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * 服务器端:接收客户端发送的文件并下载保存到本地 * * @author Spring-_-Bear * @version 2021-11-01 20:23 */ public class FileReceiveServer { public static void main(String[] args) { Socket socket = null; InputStream inputStream = null; ServerSocket serverSocket = null; OutputStream outputStream = null; BufferedWriter bufferedWriter = null; ByteArrayOutputStream byteArrayOutputStream = null; BufferedOutputStream bufferedOutputStream = null; try { // 监听端口,等待连接 serverSocket = new ServerSocket(6666); System.out.println("服务器已启动,等待连接···"); socket = serverSocket.accept(); // 读取到的字节数 int readLen; // 文件大小,单位为字节 long fileSize = 0; // 缓冲字节数组,加快读取数组 byte[] buffer = new byte[1024]; // 获得输出流,从输入流中读取客户端发送过来的二进制数组信息 inputStream = socket.getInputStream(); // 字节数组输出流,保存从 inputStream 依次读出到的二进制数据 byteArrayOutputStream = new ByteArrayOutputStream(); // 从 inputStream 中读取数据 System.out.println("文件读取中···"); // 读取 inputStream 中的数据,并将数据写进 byteArrayOutputStream while ((readLen = inputStream.read(buffer)) != -1) { byteArrayOutputStream.write(buffer, 0, readLen); fileSize += readLen; } System.out.println("文件读取成功,总大小为 " + fileSize + " bytes!"); // 将 byteArrayOutputStream 中的数据转换为字节数组(文件二进制数据) byte[] array = byteArrayOutputStream.toByteArray(); // 将最终得到的字节数组写进文件 File filePath = new File("C:\\Users\\Admin\\Desktop\\temp.jpg"); System.out.println("文件保存到本地中···"); bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(filePath)); bufferedOutputStream.write(array); System.out.println("文件保存到本地成功!保存路径为:" + filePath); // 向客户端反馈文件下载保存成功信息 outputStream = socket.getOutputStream(); bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream)); System.out.print("发送反馈信息到客户端··· "); bufferedWriter.write("文件接收成功,下载保存完成!"); bufferedWriter.newLine(); bufferedWriter.flush(); System.out.println("消息发送成功!"); } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); inputStream.close(); outputStream.close(); serverSocket.close(); bufferedWriter.close(); byteArrayOutputStream.close(); bufferedOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }