Java socket
Java socket
通信原理

通过sb压测 ./sb -u http://localhost:8801 -c 40 -N 30
单线程客户端
public class HttpServer01 {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8801);
        while (true) {
            try (Socket accept = serverSocket.accept();) {
                service(accept);
            }
        }
    }
    public static void service(Socket socket) {
        try (PrintWriter printWriter = new PrintWriter(socket.getOutputStream());) {
            printWriter.println("HTTP/1.1 200 OK");
            printWriter.println("Content-Type:text/html;charset=utf-8");
            String body = "hello,nio1";
            //显示告诉报文长度
            printWriter.println("Content-Length:" + body.getBytes(StandardCharsets.UTF_8).length);
            //报文头和报文体通过空行分割
            printWriter.println();
            printWriter.write(body);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
多线程客户端
/**
 * 多线程客户端
 */
public class HttpServer02 {
    public static void main(String[] args) throws IOException {
        ExecutorService executors = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 2);
        System.out.println(Runtime.getRuntime().availableProcessors());
        ServerSocket serverSocket = new ServerSocket(8802);
        while (true) {
            final Socket accept = serverSocket.accept();
            executors.execute(() -> service(accept));
        }
    }
    public static void service(Socket socket) {
        try (PrintWriter printWriter = new PrintWriter(socket.getOutputStream());) {
            printWriter.println("HTTP/1.1 200 OK");
            printWriter.println("Content-Type:text/html;charset=utf-8");
            String body = "hello,nio2";
            //显示告诉报文长度
            printWriter.println("Content-Length:" + body.getBytes(StandardCharsets.UTF_8).length);
            //报文头和报文体通过空行分割
            printWriter.println();
            printWriter.write(body);
            printWriter.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
深入io


IO模型
同步:发起请求后等待处理结果 异步:发起请求后,接受通知或检查处理结果
同步、异步指通信模式 阻塞、非阻塞是线程的处理模式

基本都是同步模型
针对java中而言
BIO:blocking 阻塞I/O模型
NIO:non-blocking 同步非阻塞I/O模型
1.阻塞式IO

2.非阻塞IO

3.IO多路复用

新增reactor和epoll 共享内存空间
4.信号驱动IO

5.异步IO

6.压测工具压测服务端
- sb 
sb -u http://localhost:8801 -c 40 -N 30