输入/输出代码执行(首先执行的是客户端还是服务器?)

时间:2019-05-08 22:05:18

标签: java io

我们刚刚开始研究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年回复他吗?

这些问题看似简单,但它们并不能让我理解更困难的代码。

1 个答案:

答案 0 :(得分:1)

简单地说是因为readLine()accept()blocking

“在计算中,进程是正在执行的计算机程序的一个实例。一个进程始终完全处于一种进程状态。被阻止的 进程是正在等待某个事件的进程,例如资源变得可用或I / O操作完成

程序将挂在readline()上,直到到达换行符或流的末尾为止,就像在服务器上调用accept()一样,它挂起直到客户端连接为止。

编辑:Here is another explanation with focus on network sockets