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();
        }

    }
}
相关推荐
白总Server4 小时前
多智能体系统的中间件架构
linux·运维·服务器·中间件·ribbon·架构·github
_一条咸鱼_5 小时前
揭秘 Android TextInputLayout:从源码深度剖析其使用原理
android·java·面试
_一条咸鱼_5 小时前
揭秘!Android VideoView 使用原理大起底
android·java·面试
_一条咸鱼_5 小时前
深度揭秘!Android TextView 使用原理全解析
android·java·面试
_一条咸鱼_5 小时前
深度剖析:Android Canvas 使用原理全揭秘
android·java·面试
_一条咸鱼_5 小时前
深度剖析!Android TextureView 使用原理全揭秘
android·java·面试
_一条咸鱼_5 小时前
揭秘!Android CheckBox 使用原理全解析
android·java·面试
_一条咸鱼_5 小时前
深度揭秘:Android Toolbar 使用原理的源码级剖析
android·java·面试