TCP-模拟BS架构通信

简介

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

响应报文的格式

服务端

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

服务端

java 复制代码
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();
        }

    }
}

服务端读取线程

java 复制代码
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();
        }
    }
}

使用线程池优化一下

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

服务器端

java 复制代码
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();
        }

    }
}
相关推荐
小梁努力敲代码2 小时前
java数据结构--List的介绍
java·开发语言·数据结构
摸鱼的老谭2 小时前
构建Agent该选Python还是Java ?
java·python·agent
lang201509283 小时前
Spring Boot 官方文档精解:构建与依赖管理
java·spring boot·后端
夫唯不争,故无尤也3 小时前
Tomcat 启动后只显示 index.jsp,没有进入你的 Servlet 逻辑
java·servlet·tomcat
zz-zjx3 小时前
Tomcat核心组件全解析
java·tomcat
Deschen3 小时前
设计模式-外观模式
java·设计模式·外观模式
可触的未来,发芽的智生3 小时前
新奇特:黑猫警长的纳米世界,忆阻器与神经网络的智慧
javascript·人工智能·python·神经网络·架构
悟乙己3 小时前
MLops | 基于AWS Lambda 架构构建强大的机器学习(ML)血缘关系
机器学习·架构·aws
007php0073 小时前
百度面试题解析:微服务架构、Dubbo、Redis及其一致性问题(一)
redis·百度·docker·微服务·容器·职场和发展·架构
why技术4 小时前
从18w到1600w播放量,我的一点思考。
java·前端·后端