Как BufferedReader взаимодействует с сокетом? О том, как работают сокеты - PullRequest
1 голос
/ 05 апреля 2020

Я следовал руководству о том, как создать простое приложение для чата в Java. Я понимаю основополагающий принцип взаимодействия клиента и клиента. До сих пор я использовал PrintWriter для отправки и BufferedReader для получения информации для обеих сторон. Но чего я не понимаю, так это как это не приводит к ошибкам?

Socket soc = new Socket(ipAddress, port);
BufferedReader in = new BufferedReader( new InputStreamReader(soc.getInputStream));
while(true) {

    String str = in.readLine();

}

Мой вопрос будет следующим. Оператор in.readLine() ожидает ввода? Если это не так, не должна ли программа выдавать ошибки при использовании str, поскольку она не имеет значения? Или в общих чертах, Socket специфицирует c функции, подобные Socket soc = serverSocket.accept();, или как в приведенном выше примере чтение InputStream "ждет" какого-либо сигнала? Я пропустил какое-то важное понятие о сокетах? Было бы здорово, если бы кто-то мог помочь мне понять эту топику c дальше.

Заранее спасибо,

Аппа

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Мой вопрос будет следующим. Является ли оператор in.readLine () ожидающим ввода?

Да, это «ожидание ввода», поскольку .readLine() является блокировкой метод

Если это не так, не должен Программа выдает ошибки при использовании str, поскольку она не имеет значения?

Я не могу разобрать это - утверждение не имеет смысла. Какую ошибку / исключение вы ожидаете?

Или в общих чертах, Socket специфицирует c функции, такие как Socket so c = serverSocket.accept (); или, как в приведенном выше примере, чтение InputStream "ждет" сигнала вообще?

Опять же, я боюсь, что это не слишком ясно (по крайней мере, для меня). ServerSocket#accept() является методом блокировки и будет ожидать подключения к сокету, если это то, о чем вы просите.


Обратите внимание, что этот код:

while(true) {
    String str = in.readLine();
}

, хотя он действителен, не будет особенно полезен, поскольку вы читаете строку, а затем отбрасываете ее, ничего не делая с ней. Лучше либо напечатать полученную строку, либо передать ее в метод, где она может быть использована каким-либо образом. С другой стороны, я полагаю, что это может быть полезно, если все, что вам нужно, - это «поглотить» поток, чтобы предотвратить переполнение буферов ОС.

0 голосов
/ 05 апреля 2020

Да, readLine фактически блокирует. Он ожидает, пока вы не прочитаете возврат каретки / перевод строки или сокет не закроется.

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