TCP-模拟BS架构通信

简介

  • bs是通过浏览器进行访问的
  • 每次访问都会开启一个短期的socket用来访问服务器的资源

在这里插入图片描述

响应报文的格式

在这里插入图片描述

服务端

bs架构中的b是浏览器,不需要我们书写,我们只需要书写服务端即可

服务端

public class Server {
    public static void main(String[] args) {
        System.out.println("服务启动成功!");
        //1. 创建一个ServerSocket对象
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(8888);
            //2. 服务端一直处于监听状态,等待客户端的连接
            while (true) {
                //accept()方法是一个阻塞方法,会一直等待客户端的连接
                new ServerReaderThread(serverSocket.accept()).start();
                System.out.println("有新的客户端连接上来了!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

服务端读取线程

public class ServerReaderThread extends Thread {

    private Socket socket;

    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {

        try (
                OutputStream outputStream = socket.getOutputStream();
                // 打印流更容易打印数据
                PrintStream printStream = new PrintStream(outputStream);
        ) {
            while (true) {
               printStream.println("HTTP/1.1 200 OK");
                printStream.println("Content-Type: text/html; charset=utf-8");
                // 必须要有空行
                printStream.println();
                printStream.println("<h1>hello world</h1>");
                socket.close(); // 关闭socket
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用线程池优化一下

  • 如果有一万个请求,那就有一万个线程,服务器绝壁挂机
  • 使用线程池优化一下

在这里插入图片描述

服务器端

public class Server {
    public static void main(String[] args) {
        System.out.println("服务启动成功!");
        //1. 创建一个ServerSocket对象
        ServerSocket serverSocket = null;

        // 创建一个线程池
        ThreadPoolExecutor pool = new ThreadPoolExecutor(8 + 1, 8 * 2, 10, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(8), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

        try {
            serverSocket = new ServerSocket(8888);
            //2. 服务端一直处于监听状态,等待客户端的连接
            while (true) {
                //accept()方法是一个阻塞方法,会一直等待客户端的连接
                pool.execute(new ServerReaderThread(serverSocket.accept()));
                System.out.println("有新的客户端连接上来了!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

相关推荐

  1. 通信协议的TCP/IP模型

    2024-04-25 10:26:04       48 阅读
  2. C语言TCP通信基础CS模型

    2024-04-25 10:26:04       41 阅读
  3. <span style='color:red;'>TCP</span><span style='color:red;'>通信</span>

    TCP通信

    2024-04-25 10:26:04      30 阅读
  4. BS架构和CS架构的区别

    2024-04-25 10:26:04       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-25 10:26:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-25 10:26:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-25 10:26:04       87 阅读
  4. Python语言-面向对象

    2024-04-25 10:26:04       96 阅读

热门阅读

  1. 网络安全学习路线推荐

    2024-04-25 10:26:04       38 阅读
  2. 网络基本概念

    2024-04-25 10:26:04       26 阅读
  3. 桐乡上元——UI设计

    2024-04-25 10:26:04       34 阅读
  4. Oracle 中的函数

    2024-04-25 10:26:04       39 阅读
  5. 【.Net8教程】(二)原始字符串字面量

    2024-04-25 10:26:04       36 阅读
  6. 深度学习pytorch小实验

    2024-04-25 10:26:04       34 阅读
  7. 前端面试真题

    2024-04-25 10:26:04       36 阅读
  8. 41. 【Android教程】Android 手势处理

    2024-04-25 10:26:04       33 阅读
  9. golang调用阿里通义千问的接口

    2024-04-25 10:26:04       30 阅读
  10. 程序员缓解工作压力的小窍门

    2024-04-25 10:26:04       32 阅读