相当于 Socket 就是一个抽象了连接服务器某个端口的类,和 List 这些没有什么本质区别

一个 Socket 就代表了一个连接

Connecting to a Server

使用 telnet 在终端, 或者使用 Socket 在 Java

try(var c = new Socket("localhost", 22)) {  
    var in = new Scanner(c.getInputStream(), StandardCharsets.UTF_8);  
    var out = new PrintWriter(c.getOutputStream(), true);  // 注意这个 auto flush  
    new Thread(() -> {  
        while(true) {  
            if (in.hasNext())  
                System.out.println("from server: " + in.nextLine());  
        }  
    }).start();  
  
    while(true) {  
        var stdin = new Scanner(System.in);  
        out.println(stdin.nextLine());  
    }  
}

经测试,连接 server 是即时的,如果连接失败了,就直接失败报错了。不过通常来讲,server 那边要一直可以接受,client 这里要反复请求,所以也没关系。只是在这个程序中,要求先启动 server,再启动 client

Implementing Servers

try(var s = new ServerSocket(22)) {  
    var conn = s.accept();  
    var in = new Scanner(conn.getInputStream(), StandardCharsets.UTF_8);  
    var out = new PrintWriter(conn.getOutputStream(), true);  
  
    new Thread(() -> {  
        while(true) {  
            if (in.hasNext())  
                System.out.println("from client: " + in.nextLine());  
        }  
    }).start();  
  
    while(true) {  
        var stdin = new Scanner(System.in);  
        out.println(stdin.nextLine());  
    }  
}

经测试,如果 accept 没有接收到连接,会阻塞等待,一旦建立连接,就运行下去了,第二个连接就没人连接了

在设计思路上,主程序只用来创建连接,一旦连接正确创立,就把这个连接交给线程处理。而线程最好是划分职责的,一个线程完成一个操作

Half-Close

没听懂这个的应用场景