Как чтение из и запись в сокеты синхронизируются?

Мы создаем сокет. На одной стороне сокета у нас есть "сервер" и на другой стороне существует "клиент". Оба, сервер и клиент, могут записать в и читать из сокета. Это - то, что я понимаю. Я не понимаю следующие вещи:

  1. Если сервер читает из сокета, он видит в сокете, только они наполняют, который был записан в сокет клиентом? Я имею в виду, пишет ли сервер что-то в сокет и, чем чтения от сокета, будет он (сервер) видеть в сокете материал, который он (сервер) записал там?Надеюсь, что нет.

  2. Давайте рассмотрим следующую ситуацию. Клиент пишет что-то в сокет, и затем он пишет что-то новое для сокета и затем чтений сервера от сокета. Что сервер будет видеть там? Только "новый" материал, записанный клиентом или и "новый" и "старый"?

  3. Если клиент (или сервер) пишет в сокет, он может видеть, была ли записанная информация получена другой стороной? Например, out.println("Hello, Server!") возвратится true это сервер получило это сообщение.

5
задан Bryan Denny 22 March 2010 в 19:09
поделиться

3 ответа

Соединение через сокет представляет два однонаправленных потока: один от клиента к серверу и один от сервера к клиенту.

Каждая сторона может помещать данные в один поток и читать из другого.

Данные, помещенные в один поток, добавляются в конец уже имеющихся данных.

Когда данные считываются с одного конца потока, считываются самые старые доступные данные (т. Е. Поток является FIFO).

Эти утверждения должны позволить вам ответить на все ваши вопросы, но я также сделаю это явным образом:

  1. Сервер будет читать только то, что написал клиент, а не то, что он написал сам
  2. Сервер будет читать сначала старые, а затем новые
  3. . У клиента нет непосредственного способа узнать, действительно ли данные были получены другой стороной, если только сервер не отправит что-то в ответ. В некоторых случаях он может знать, что отправка не удалась (например, когда есть физическая проблема на стороне клиента), но обычно не может полагаться на наличие этого уведомления.
4
ответ дан 15 December 2019 в 00:57
поделиться

Сокеты предоставляют два однонаправленных «канала» для связи с другим концом: один для чтения данных (InputStream), а другой для отправки данных (OutputStream). Следовательно, нет опасности при чтении в входной поток сразу после записи чего-либо в выходной поток.

Во-вторых, запись новых данных в выходной поток не перезаписывает и не заменяет «старое» содержимое. Контент буферизуется до тех пор, пока его не прочитает другое приложение.

Наконец, получение данных не подтверждается другой стороной, но если вы не получите исключение IOException после отправки данных, вы можете быть уверены, что оно было получено другим приложением.

0
ответ дан 15 December 2019 в 00:57
поделиться
  1. Вы правы. Сервер будет видеть только то, что клиент записал в сокет

  2. Сервер должен видеть и старое, и новое (сначала старое, а затем новое)

  3. Я думаю, это зависит от типа сокета. TCP будет надежным (ваши данные дойдут до другого конца), тогда как UDP не заботится (вы просто хотите, чтобы данные были быстрыми, и потеря допустима, то есть потоковое видео). Но вы не узнаете, было ли получено сообщение, если не отправите ответ обратно в сокет.

0
ответ дан 15 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: