Как синхронизируются чтение и запись в сокеты? - PullRequest
5 голосов
/ 22 марта 2010

Создаем сокет. С одной стороны сокета у нас есть «сервер», а с другой - «клиент». И сервер, и клиент могут писать и читать из сокета. Это то, что я понимаю. Я не понимаю следующих вещей:

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

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

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

Ответы [ 3 ]

4 голосов
/ 22 марта 2010

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

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

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

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

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

  1. Сервер будет читать только то, что написал клиент,а не то, что он сам написал
  2. Сервер будет сначала читать старые данные, а затем новые вещи
  3. У клиента нет непосредственного способа узнать, были ли данные фактически получены другой стороной,если сервер не отправит что-то в ответ.В некоторых условиях он может знать, если отправка не удалась (например, когда есть физическая проблема на стороне клиента), но обычно не может полагаться на то, что уведомление там.
0 голосов
/ 22 марта 2010

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

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

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

0 голосов
/ 22 марта 2010
  1. Вы правы. Сервер увидит только то, что клиент записал в сокет

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

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

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