Мы создаем сокет. На одной стороне сокета у нас есть "сервер" и на другой стороне существует "клиент". Оба, сервер и клиент, могут записать в и читать из сокета. Это - то, что я понимаю. Я не понимаю следующие вещи:
Если сервер читает из сокета, он видит в сокете, только они наполняют, который был записан в сокет клиентом? Я имею в виду, пишет ли сервер что-то в сокет и, чем чтения от сокета, будет он (сервер) видеть в сокете материал, который он (сервер) записал там?Надеюсь, что нет.
Давайте рассмотрим следующую ситуацию. Клиент пишет что-то в сокет, и затем он пишет что-то новое для сокета и затем чтений сервера от сокета. Что сервер будет видеть там? Только "новый" материал, записанный клиентом или и "новый" и "старый"?
Если клиент (или сервер) пишет в сокет, он может видеть, была ли записанная информация получена другой стороной? Например, out.println("Hello, Server!")
возвратится true
это сервер получило это сообщение.
Соединение через сокет представляет два однонаправленных потока: один от клиента к серверу и один от сервера к клиенту.
Каждая сторона может помещать данные в один поток и читать из другого.
Данные, помещенные в один поток, добавляются в конец уже имеющихся данных.
Когда данные считываются с одного конца потока, считываются самые старые доступные данные (т. Е. Поток является FIFO).
Эти утверждения должны позволить вам ответить на все ваши вопросы, но я также сделаю это явным образом:
Сокеты предоставляют два однонаправленных «канала» для связи с другим концом: один для чтения данных (InputStream), а другой для отправки данных (OutputStream). Следовательно, нет опасности при чтении в входной поток сразу после записи чего-либо в выходной поток.
Во-вторых, запись новых данных в выходной поток не перезаписывает и не заменяет «старое» содержимое. Контент буферизуется до тех пор, пока его не прочитает другое приложение.
Наконец, получение данных не подтверждается другой стороной, но если вы не получите исключение IOException после отправки данных, вы можете быть уверены, что оно было получено другим приложением.
Вы правы. Сервер будет видеть только то, что клиент записал в сокет
Сервер должен видеть и старое, и новое (сначала старое, а затем новое)
Я думаю, это зависит от типа сокета. TCP будет надежным (ваши данные дойдут до другого конца), тогда как UDP не заботится (вы просто хотите, чтобы данные были быстрыми, и потеря допустима, то есть потоковое видео). Но вы не узнаете, было ли получено сообщение, если не отправите ответ обратно в сокет.