Курс 6.005 предоставляет фундаментальные знания и технологии для разработки программного обеспечения. http://web.mit.edu/6.005/www/fa16/
Перевод публикации 21 (Sockets & Networking). http://web.mit.edu/6.005/www/fa16/classes/21-sockets-networking/
Курс 6.005 предоставляет фундаментальные знания и технологии для разработки программного обеспечения. http://web.mit.edu/6.005/www/fa16/
Перевод публикации 21 (Sockets & Networking). http://web.mit.edu/6.005/www/fa16/classes/21-sockets-networking/
Данный паттерн состоит из двух процессов: клиент и сервер. Клиент создает соединение с сервером. Он посылает реквесты на сервер, а тот в свою очередь посылает в ответ респонсы. Затем клиент обрывает соединение. Сервер может принимать соединения от множества клиентов одновременно, и клиенты могут конектиться к нескольким серверам.
Множество интернет приложений работают таким образом: веб браузеры являются клиентами для веб серверов, почтовые сервисы, такие как Outlook являются клиентами для почтовых серверов и т.д.
В интернете клиент и сервер обычно находятся на разных машинах и соединяются только по сети. Но не всегда так и есть, сервер может быть процессом, выполняющимся на той же машине, что и клиент.
[1] http://web.mit.edu/6.005/www/fa16/classes/21-sockets-networking/#clientserver_design_pattern
Данные, которыми по сети обмениваются клиент и сервер, шлются блоками. Редко когда бывает, что эти блоки хранят лишь байт информации (хотя и такое возможно). Отправитель (клиент посылает запрос или сервер посылает реквест) создает такой блок, который может содержать как строку "HELLO, WORLD!", так и 20 мегабайт видео данных. На транспортном уровне этот блок данных разбивается на фрагменты. После чего каждый фрагмент распределяется независимо по всему сетевому каналу. Тем временем получатель собирает эти фрагменты в единый поток байтов.
Результатом будет непредсказуемая передача данных. Данные уже могут находится в потоке, если вы захотите их извлечь, или вам придется подождать пока они прибудут и собируться.
Когда же все данные перешлются, они отправляются в буфер, массив в памяти, который содержит их до момента их прочтения.
Данные, которые передаются в сокет или приходят из него - это поток байтов.
В джаве InputStream
объект представляет собой поток входных данных. Примеры:
FileInputStream
System.in
OutputStream
объект является приемником данных. Примеры:
FileOutputStream
для создания файлов на диске.System.out
- это PrintStream
, OutputStream
, который печатает читаемые для нас данные различного типа.Важно помнить, что для сокетов выходные данные одного процесса являются входными данного для другого процесса. Если Машка и Пашка установили сокет соединение, то Машка обладает выходным потоком, который является входным для Пашки, и наоборот.
[1] http://web.mit.edu/6.005/www/fa16/classes/21-sockets-networking/#io
Точка соединения определяется IP адресом. IPv4 использует 32-битные (четырёхбайтные) адреса:
Любой может узнать IP адрес, например, гугла. Каждый раз, когда кто-то конектится к новой сети с ноутбука, ему присваивается новый IP адрес.
Хостнейм - это наименование, которое транслируется в IP адресс. Один и тот же хостнейм может указывать на разные IP адреса в разные промежутки времени; множество хостнеймов могут указывать на один и тот же IP адрес. Например:
dig
, host
или nslookup
в командной строке:$ dig +short web.mit.edu
18.9.22.69
На одной машине может находиться несколько серверов, к которым может подключиться клиент, поэтому нужен способ разделять трафик на один сетевой интерфейс по разным процессам.
Сетевые интерфейсы содержат множество портов, которые определяются 16-битным номером от 0 (который является рарезирвированным, поэтому скорее от 1) и до 65535.
Один процесс на сервере занимает определенный порт или "слушает" на данном порту. Клиенты должно знать номер порта на котором находится сервер. Существуют порты, которые разервированны системными процессами и различными сервисами, например:
athena.dialup.mit.edu
по SSH, автоматически используется 22 порт.Если порт не является стандартным портом, он должен указываться явно, как часть адреса. Например, http://128.2.39.10:9000 указывает на 9000 порт машины с таким IP 128.2.39.10.
Когда клиент присоединяется к серверу, то исходящее соединение также использует порт на сетевом интерфейсе клиента, который обычно выбирается случайным образом из доступных портов.
Сокет представляет из себя соединение между клиентом и сервером.
"Слушающий" сокет используется серверным процессом чтобы ждать соединения от удаленного клиента.
В джаве используется класс ServerSocket
для создания слушающего сокета.
Присоединенный сокет может слать и получать сообщения от процесса на другом конце соединения. Он определяется локальным IP адресом и номером порта плюс удаленный адрес и порт, что в свою очередь позволяет серверу различать одинаковые соединения с разных IP адресов и с одного IP адреса на разные удаленные порты.
В джаве используются Socket
конструктор для создание сокет соединения с сервром. Сервера получают присоединенный сокет в виде Socket
объекта, возвращаемого из ServerSocket.accept
.
[1] http://web.mit.edu/6.005/www/fa16/classes/21-sockets-networking/#network_sockets