我们刚刚开始研究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年回应他?
这些问题看似简单,但它们不会让我理解更困难的代码。
最佳答案
简单地说是因为readLine()
和accept()
是blocking。
“在计算中,一个进程是正在执行的计算机程序的一个实例。一个进程始终恰好处于一个进程状态。被阻塞的进程是等待某个事件(例如资源变得可用或正在运行)的进程。 I / O操作完成”
程序将挂在readline()
上,直到到达换行符或流的末尾为止,就像在服务器上调用accept()
时一样,它挂起直到客户端连接为止。
编辑:Here is another explanation with focus on network sockets。
关于java - 输入/输出代码执行(首先执行的是客户端还是服务器?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56049641/