相当于 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
没听懂这个的应用场景