注意点

1、accept

阻塞接收直到有连接进来再继续往下运行

2、socket.getInputStream

会立即得到一个输入流,随着写入数据会不断进入输入流,也就是说这个输入流是可变的,在读取这个输入流的时候,读到结束字符再结束读取。
而这个结束字符发送端需要调用socket.shutdownOutput()往数据流中写入;

代码

  1. package com.ChuanWenJian;
  2. import java.io.*;
  3. import java.net.InetAddress;
  4. import java.net.Socket;
  5. import java.net.UnknownHostException;
  6. /**
  7. * @author: mxl
  8. * @description: TODO TCP传文件
  9. * @date: 2021/2/4 18:34
  10. * null
  11. * @return
  12. */
  13. public class TcpClientDemo01 {
  14. //
  15. public static void main(String[] args) throws IOException, InterruptedException {
  16. // 1、
  17. Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 8089);
  18. // 2、创建一个输出流
  19. OutputStream os=socket.getOutputStream();
  20. // 3\文件流
  21. FileInputStream fileInputStream = new FileInputStream(new File("earth.jpg"));
  22. // 4、写出文件
  23. byte[] buffer=new byte[1024];
  24. int len;
  25. while ((len=fileInputStream.read(buffer))!=-1)
  26. {
  27. os.write(buffer,0,len);
  28. Thread.sleep(100);
  29. System.out.println(1);
  30. }
  31. //告诉服务器传输完了
  32. socket.shutdownOutput();//告诉结束了输出,让服务端继续经行
  33. //确定服务器接收完毕才可以断开链接
  34. InputStream inputStream = socket.getInputStream();
  35. //传进来的为Stirng byte[]
  36. ByteArrayOutputStream baos=new ByteArrayOutputStream();
  37. byte[] bufer2=new byte[2024];
  38. int len2;
  39. while ((len2=inputStream.read(bufer2))!=-1)
  40. {
  41. baos.write(bufer2,0,len2);
  42. System.out.println(baos.toString());
  43. }
  44. //
  45. // 关闭流操作
  46. }
  47. }
  1. package com.ChuanWenJian;
  2. import java.io.*;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. public class TcpServerDemo01 {
  6. public static void main(String[] args) throws IOException, InterruptedException {
  7. // 1、创建服务
  8. ServerSocket serverSocket=new ServerSocket(8089);
  9. // 2、监听连接,阻塞式监听
  10. Socket socket =serverSocket.accept();
  11. // 3、获取输入流
  12. InputStream in=socket.getInputStream();
  13. System.out.println("接收完了");
  14. // 4、文件输出
  15. FileOutputStream fos=new FileOutputStream(new File("cz2.jpg"));
  16. byte[] buffer=new byte[1024];
  17. int len;
  18. while ((len=in.read(buffer))!=-1)
  19. {
  20. fos.write(buffer,0,len);
  21. }
  22. //不加shoudown会卡在这一步,一直在while循环中
  23. //通知客户端接收完毕了
  24. System.out.println("读取完了");
  25. OutputStream os=socket.getOutputStream();
  26. os.write("我接收完毕了,你断开zcxc吧".getBytes());
  27. System.out.println("@2");
  28. // 关闭流操作 TODO 这边传完不关闭socket的话会造成那边发生异常
  29. // fos.close();
  30. // in.close();
  31. socket.close();
  32. // serverSocket.close();
  33. }
  34. }