我们刚刚开始研究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/

10-11 22:38
查看更多