客户端发送一个本地文件给服务器,服务器接收到这个文件并且存储到指定的文件夹中,并且给客户端回写“上传成功”

客户端

  1. package JDBC_DemoDay07.TCP;/*
  2. @create 2021--01--05--14:07
  3. */
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.net.Socket;
  9. /**
  10. * 文件上传案例的客户端,读取本地文件,上传到服务器,读取服务器回写的数据
  11. *
  12. * 实现步骤:
  13. * 1.创建一个本地字节输入流FileInputStream对象,构造方法中绑定读取的数据源
  14. * 2.创建一个客户端Socket对象,构造方法中绑定服务器的IP地址和端口号
  15. * 3.使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象
  16. * 4.使用本地字节输入流FileInputStream对象中的方法read,读取本地文件
  17. * 5.使用网络字节输出流OutputStream对象中的方法write,把读取到的文件上传到服务器
  18. * 6.使用Socket中的方法getInputStream,获取网络字节输入流InputStream对象
  19. * 7.使用网络字节输入流InputStream对象中的方法read读取服务回写的数据
  20. * 8.释放资源(FileInputStream,Socket)
  21. */
  22. public class TCPClient {
  23. public static void main(String[] args) {
  24. try {
  25. //1.创建一个本地字节输入流FileInputStream对象,构造方法中绑定读取的数据源
  26. FileInputStream fis = new FileInputStream("E:\\照骗\\A.JPG");
  27. // 2.创建一个客户端Socket对象,构造方法中绑定服务器的IP地址和端口号
  28. Socket socket = new Socket("localhost", 8898);
  29. // 3.使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象
  30. OutputStream os = socket.getOutputStream();
  31. // 4.使用本地字节输入流FileInputStream对象中的方法read,读取本地文件
  32. byte[] bytes = new byte[1024];
  33. int len = 0;
  34. while ((len = fis.read(bytes)) != -1) {
  35. //5.使用网络字节输出流OutputStream对象中的方法write,把读取到的文件上传到服务器
  36. os.write(bytes, 0, len);
  37. }
  38. /**
  39. * 解决:上传完文件,给服务器写一个结束标记
  40. */
  41. socket.shutdownOutput();
  42. //6.使用Socket中的方法getInputStream,获取网络字节输入流InputStream对象
  43. InputStream is = socket.getInputStream();
  44. //7.使用网络字节输入流InputStream对象中的方法read读取服务回写的数据
  45. while ((len = is.read(bytes)) != -1) {
  46. System.out.println(new String(bytes, 0, len));
  47. }
  48. fis.close();
  49. socket.close();
  50. } catch (Exception e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. }

服务器端

利用多线程处理多个客户端上传的文件,提高效率

  1. package JDBC_DemoDay07.TCP;/*
  2. @create 2021--01--05--14:08
  3. */
  4. import java.io.*;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7. import java.util.Random;
  8. /**
  9. * 文件上传案例服务器端:读取客户端上传的文件,保存到服务器的硬盘,给客户端回写“上传成功”
  10. * <p>
  11. * 明确:
  12. * 数据源:客户端上传的文件
  13. * 目的地:服务器的硬盘 D:\\a\\1.jpg
  14. * <p>
  15. * 实现步骤:
  16. * 1.创建一个服务器ServerSocket对象,和系统要指定的端口号
  17. * 2.使用ServerSocket对象中的方法accept,获取到请求的客户端Socket对象
  18. * 3.使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
  19. * 4.判断D:\\a文件夹是否存在,不存在则创建
  20. * 5.创建一个本地字节输出流FileOutputStream对象,构造方法中绑定要输出的目的地
  21. * 6.使用网络字节输入流InputStream对象中的方法read,读取客户端上传的文件
  22. * 7.使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上
  23. * 8.使用Socket对象中的方法getOutputStream,获取到网络字节输出流OutputStream对象
  24. * 9.使用网络字节输出流OutputStream对象中的方法write,给客户端回写“上传成功”
  25. * 10.释放资源(FileOutputStream,Socket,ServerSocket)
  26. */
  27. public class TCPServer {
  28. public static void main(String[] args) {
  29. try {
  30. //1.创建一个服务器ServerSocket对象,和系统要指定的端口号
  31. ServerSocket server = new ServerSocket(8898);
  32. //2.使用ServerSocket对象中的方法accept,获取到请求的客户端Socket对象
  33. /**
  34. * 让服务器一直处于监听状态(死循环accept方法)
  35. * 有一个客户端上传文件,就保存一个文件
  36. */
  37. while (true) {
  38. Socket socket = server.accept();
  39. /**
  40. * 使用多线程技术,提高程序的效率
  41. * 有一个客户端上传文件,就开启一个线程,完成文件的上传
  42. */
  43. new Thread(new Runnable() {
  44. //完成文件的上传
  45. @Override
  46. public void run() {
  47. try {
  48. //3.使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
  49. InputStream is = socket.getInputStream();
  50. //4.判断D:\\a文件夹是否存在,不存在则创建
  51. File file = new File("d:\\a");
  52. if (!file.exists()) {
  53. file.mkdir();
  54. }
  55. /**
  56. * 自定义一个文件的命名规则:防止同名的文件被覆盖
  57. * 规则:域名+毫秒值+随机数
  58. */
  59. String fileName = "itcast" + System.currentTimeMillis() + new Random().nextInt(1010) + ".jpg";
  60. //5.创建一个本地字节输出流FileOutputStream对象,构造方法中绑定要输出的目的地
  61. FileOutputStream fos = new FileOutputStream(file + "\\" + fileName);
  62. //6.使用网络字节输入流InputStream对象中的方法read,读取客户端上传的文件
  63. byte[] bytes = new byte[1024];
  64. int len = 0;
  65. while ((len = is.read(bytes)) != -1) {
  66. //7.使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上
  67. fos.write(bytes, 0, len);
  68. }
  69. //8.使用Socket对象中的方法getOutputStream,获取到网络字节输出流OutputStream对象
  70. OutputStream os = socket.getOutputStream();
  71. //9.使用网络字节输出流OutputStream对象中的方法write,给客户端回写“上传成功”
  72. os.write("收到谢谢".getBytes());
  73. //10.释放资源(FileOutputStream,Socket,ServerSocket)
  74. fos.close();
  75. socket.close();
  76. } catch (Exception e) {
  77. }
  78. }
  79. }).start();
  80. }
  81. //服务器就不用关闭了
  82. //server.close();
  83. } catch (IOException e) {
  84. e.printStackTrace();
  85. }
  86. }
  87. }

服务器端接收到客户端文件中的数据,向服务器端的另一个文件中写出,接收到文件内容,写到某个文件中

客户端

  1. package Test23_Demo.Demo06;/*
  2. @create 2020--12--16--15:14
  3. */
  4. import java.io.FileInputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.net.Socket;
  9. /**
  10. * 上传文件
  11. * 读取文件的内容,发送给服务器端
  12. */
  13. public class client {
  14. public static void main(String[] args) throws IOException {
  15. //建立客户端
  16. Socket socket = new Socket("localhost", 8888);
  17. //建立连接后,获取socket的io流
  18. OutputStream outputStream = socket.getOutputStream();
  19. //获取文件的对象
  20. FileInputStream fis = new FileInputStream("stu.txt");
  21. //读取文件的内容
  22. int b = -1;
  23. while ((b = fis.read()) != -1) {
  24. outputStream.write(b);
  25. //输出数据给服务器
  26. }
  27. //关闭流
  28. fis.close();
  29. //告知服务器,不再发送数据了
  30. socket.shutdownOutput();
  31. //获取输入流,接收服务器端的相应
  32. InputStream in = socket.getInputStream();
  33. int read = in.read();
  34. System.out.println((char) read);
  35. //关闭socket
  36. socket.close();
  37. }
  38. }

服务器端

  1. package Test23_Demo.Demo06;/*
  2. @create 2020--12--16--15:13
  3. */
  4. import HeiMa.Demo.Input;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. import java.net.ServerSocket;
  10. import java.net.Socket;
  11. public class server {
  12. public static void main(String[] args) throws IOException {
  13. //建立服务器
  14. ServerSocket serverSocket = new ServerSocket(8888);
  15. //获取流
  16. Socket accept = serverSocket.accept();
  17. //建立连接后,获取socket的流
  18. InputStream in = accept.getInputStream();
  19. //获取到上传文的内容,要有一个文件
  20. FileOutputStream fos = new FileOutputStream("ASCII码表完整版.doc");
  21. //反复使用一个字节读取
  22. int b = -1;
  23. while ((b = in.read()) != -1) {
  24. //一次读取一个字节,最终这个文件接收了所有的上传数据
  25. fos.write(b);
  26. }
  27. //关闭io流
  28. fos.close();
  29. //给客户端返回一个相应 - o
  30. OutputStream out = accept.getOutputStream();
  31. String content = "o";
  32. out.write(content.getBytes());
  33. //关闭socket
  34. accept.close();
  35. serverSocket.close();
  36. }
  37. }