Выполнение кодов ввода / вывода (что выполняется первым, клиент или сервер?) - PullRequest
1 голос
/ 09 мая 2019

Мы только начали изучать коды ввода-вывода, и есть определенный момент, я не понимаю этой проблемы: Вот код сервера:

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 Ответ

1 голос
/ 09 мая 2019

Проще говоря, потому что readLine() и accept() являются блокирующими .

"В вычислениях процесс - это экземпляр выполняемой компьютерной программы. Процесс всегда существует ровно в одном состоянии процесса. заблокированный процесс - это процесс, ожидающий какого-либо события например, доступ к ресурсу или завершение операции ввода-вывода "

Программа будет зависать на readline() до тех пор, пока не будет достигнут перевод строки или конец потока, точно так же, как когда на сервере вызывается accept(), он зависает, пока клиент не подключится.

edit: Вот еще одно объяснение с акцентом на сетевые сокеты .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...