server代码

  1. package cn.ant.demo;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7. public class Server {
  8. //使用Socket进行网络通信
  9. static ServerSocket server = null;
  10. //基于字节流
  11. static InputStream in = null;
  12. static OutputStream out = null;
  13. public static void main(String[] args) {
  14. try {
  15. server = new ServerSocket(8000);
  16. System.out.println("服务端启动成功,监听端口为8000,等待客户端连接...");
  17. // while (true){
  18. // TODO Auto-generated method stub
  19. Socket socket = server.accept(); //等待客户端连接
  20. System.out.println("客户连接成功,客户信息为:" +socket.getRemoteSocketAddress());
  21. in = socket.getInputStream();
  22. byte[] buffer = new byte[1024];
  23. int len = 0;
  24. //读取客户端的数据
  25. while ((len = in.read(buffer)) > 0) {
  26. System.out.println(new String(buffer, 0, len));
  27. }
  28. //向客户端写数据
  29. out = socket.getOutputStream();
  30. out.write("hello!".getBytes());
  31. // }
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }

client代码

  1. package cn.ant.demo;
  2. import java.io.IOException;
  3. import java.io.OutputStream;
  4. import java.net.Socket;
  5. import java.util.Scanner;
  6. public class Client {
  7. public static void main(String[] args) throws IOException {
  8. //创建套接字对象socket并封装ip与port
  9. Socket socket = new Socket("127.0.0.1", 8000);
  10. //根据创建的socket对象获得一个输出流
  11. //基于字节流
  12. OutputStream outputStream = socket.getOutputStream();
  13. //控制台输入以IO的形式发送到服务器
  14. System.out.println("TCP连接成功 \n请输入:");
  15. String str = new Scanner(System.in).nextLine();
  16. byte[] car = str.getBytes();
  17. outputStream.write(car);
  18. System.out.println("TCP协议的Socket发送成功");
  19. //刷新缓冲区
  20. outputStream.flush();
  21. //关闭连接
  22. socket.close();
  23. }
  24. }

IO阻塞问题

只有一个用户请求时

image.png

有多个用户请求时

出现阻塞问题,第二个请求因阻塞未被及时处理
image.png

线程处理IO阻塞问题

image.png

注意:开启线程处理IO阻塞问题,并不是最好的,这只能解决,低并发问题,并且开启线程会大量消耗CUP资源.