我们刚刚开始研究IO代码,但有一点我不理解此问题: 这是服务器代码:
public final class SuccServer {
public static void main(String[] args) {
try (ServerSocket s0 = new ServerSocket(5108);
Socket s = s0.accept();
BufferedReader r =
new BufferedReader(
new InputStreamReader(s.getInputStream(),
US_ASCII));
BufferedWriter w =
new BufferedWriter(
new OutputStreamWriter(s.getOutputStream(),
US_ASCII))) {
int i = Integer.parseInt(r.readLine());
int i1 = i + 1;
w.write(String.valueOf(i1));
w.write('\n');
w.flush();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
这是客户端代码:
public final class SuccClient {
public static void main(String[] args) {
try (Socket s = new Socket("localhost", 5108);
BufferedReader r =
new BufferedReader(
new InputStreamReader(s.getInputStream(),
US_ASCII));
BufferedWriter w =
new BufferedWriter(
new OutputStreamWriter(s.getOutputStream(),
US_ASCII))) {
int i = 2019;
w.write(String.valueOf(i));
w.write('\n');
w.flush();
int succ = Integer.parseInt(r.readLine());
System.out.printf("succ(%d) = %d%n", i, succ);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
首先建立连接,以便accept()创建套接字,然后我不了解代码将如何工作(按时间顺序),为什么客户机的写指令如此
w.write(String.valueOf(i));
首先执行而不是服务器的
int i = Integer.parseInt(r.readLine());
,为什么在编写2019后客户端仍等待服务器的响应?他只需执行
即可继续执行代码 int succ = Integer.parseInt(r.readLine());
不等待服务器用2020年回复他吗?
这些问题看似简单,但它们并不能让我理解更困难的代码。
答案 0 :(得分:1)
简单地说是因为readLine()
和accept()
是blocking。
“在计算中,进程是正在执行的计算机程序的一个实例。一个进程始终完全处于一种进程状态。被阻止的 进程是正在等待某个事件的进程,例如资源变得可用或I / O操作完成 ”
程序将挂在readline()
上,直到到达换行符或流的末尾为止,就像在服务器上调用accept()
一样,它挂起直到客户端连接为止。
编辑:Here is another explanation with focus on network sockets。