
10. JavaLecture_Sockets.ppt
- Количество слайдов: 20
Клиент серверное приложение 1
IP адрес • IP-адрес это четыре числа от 0 до 255 разделенных точками (например 145. 76. 190. 32). мы это число записываем в десятичной системе, компьютер же "видит" его в двоичной системе - в виде "0" и "1". Эти цифры дают возможность другим компьютерам определить откуда появился запрос или куда необходимо переслать информацию. 2
Статический и динамический IP • Часть компьютеров имеет постоянные IP-адреса, еще большое количество IP-адресов служат для технических надобностей, и только часть IP-адресов свободна для пользователей, которые подключились к интернету. Эта часть свободных IPадресов называется динамическими IP-адресами, все остальные - статические. Динамические IPадреса помогают увеличить количество свободных доступных IP-адресов. 3
Статический и динамический IP • Это работает так: вы, подключаясь к интернету, получаете динамический IP-адрес. Далее вы работаете с интернетом, после - вы отключаетесь от сети интернет, выключаете компьютер. И ваш динамический адрес получает совершенно другой человек, который в этот момент решил войти в сеть. • Но не все пользователи могут подключаться к сети интернет с динамическим IP-адресом, например если компьютер используется как сервер или хранилище информации, к которому подключаются другие пользователи требуется статический IP-адрес, т. е. постоянное имя, которое будут знать другие пользователи. 4
Роутер 5
Роутер • Например в офисе есть локальная сеть, состоящая из 5 компьютеров. Всем нужны постоянные IPадреса, но покупать 5 постоянных адресов это не выход. Есть более простое решение. Все компьютеры будут иметь одинаковый IP-адрес внешне, а внутри своей маленькой сети будут иметь разные имена - внутренние IP-адреса. Выходить в интернет все они будут через главный компьютерроутер (маршрутизатор), и данные из интернета будут приходить вначале на этот маршрутизатор, и далее отправляться туда, откуда их запросили. 6
Порт • Порт - это числовой идентификатор программы или процесса, которые обслуживают сетевые соединения на заданном сетевом адресе (IPадресе). • Имеются так называемые стандартные порты, соглашения об использовании, которых все стараются придерживаться. (0 -1023) 7
Маска подсети • Маской сети или маской подсети (network mask) называется битовая маска, определяющая, какая часть IP-адреса узла сети относится к адресу сети, а какая - к адресу самого узла в этой сети. • Маска подсети — это тоже 32 -бита. Но в отличии от IPадреса, нули и единицы в ней не могут чередоваться. • Не может быть маски 120. 22. 123. 12=01111000. 00010110. 01111011. 00001100. Но может быть маска 255. 248. 0=11111111000. 0000. 8
Маска подсети • Например, узел с IP-адресом 12. 34. 56. 78 и маской подсети 255. 0. 0 находится в сети 12. 34. 0. 0. • Компьютерам маска подсети нужна для определения границ подсети. Чтоб каждый мог определить, кто находится с ним в одной подсети, а кто — за ее пределами. Дело в том, что внутри одной сети компьютеры обмениваются пакетами «напрямую» , а когда нужно послать пакет в другую сеть — шлют их шлюзу по умолчанию 9
Сокет • Cокет – это комбинация IP-адреса и порта. Сокет адрес дает возможность другим компьютерам в сети находить определенную программу, которая исполняется на определенном компьютере. • Вы можете отображать сокет адрес вот так 64. 104. 137. 58: 80, где 64. 104. 137. 58 – IP-адрес и 80 – порт. 10
Алгоритм работы В целом алгоритм работы системы клиент-сервер выглядит следующим образом: • Сервер подключается к порту на хосте и ждет соединения с клиентом; • Клиент создает сокет и пытается соединить его с портом на хосте; • Если создание сокета прошло успешно, то сервер переходит в режим ожидания команд от клиента; • Клиент формирует команду и передает ее серверу, переходит в режим ожидания ответа; • Сервер принимает команду, выполняет ее и пересылает ответ клиенту. • и т. д. 11
Эхо-сервер Это простейшая реализация клиент-серверного приложения. Клиент отправляет данные серверу. Сервер отсылает эти же данные обратно на клиент. 12
Сервер Для создания сокетов и управления ими в Java есть специальные классы java. net. Socket и java. net. Server. Socket. Первый для клиента, второй для сервера. Также нам будут необходимы два класса из пакета java. io. *: Buffered. Reader и Print. Writer для чтения/записи в сокет. 13
Сервер Для начала подключимся к порту хоста. Сделать это можно с помощью конструктора класса Server. Socket servers; try { servers = new Server. Socket(4444); } catch (IOException e) { System. out. println("Couldn't listen to port 4444"); System. exit(-1); } 14
Сервер После успешного подключения к порту сервер должен ждать подключения от клиента. Socket fromclient; try { System. out. print("Waiting for a client. . . "); fromclient = servers. accept(); System. out. println("Client connected"); } catch (IOException e) { System. out. println("Can't accept"); System. exit(-1); } 15
Сервер Как только клиент подключился к серверу, сервер должен создать потоки ввода и вывода для связи с ним. Buffered. Reader in; Print. Writer out; in = new Buffered. Reader(new Input. Stream. Reader(fromclient. get. Input. Stream())); out = new Print. Writer(fromclient. get. Output. Stream(), true); 16
Сервер И далее можно просто считывать данные из потока in и записывать данные в out. while ((input = in. read. Line()) != null) { if (input. equals. Ignore. Case("exit")) break; out. println("S : : : "+input); System. out. println(input); } 17
Клиент • Для создания клиента достаточно класса Socket и двух классов для ввода/вывода. Также необходимо знать имя компьютера (хоста), на котором запущен сервер и номер порта. Конструктор сокета имеет два параметра: имя хоста и номер порта. Socket fromserver = null; fromserver = new Socket("localhost", 4444); localhost(loopback) – это доменное имя, соответствующее IP адресу 127. 0. 0. 1, указывающему компьютеру на самого себя 18
Клиент Далее аналогичным образом, как для сервера, создаем потоки ввода вывода. Buffered. Reader in = new Buffered. Reader(new Input. Stream. Reader(fromserver. get. Input. Stream())); Print. Writer out = new Print. Writer(fromserver. get. Output. Stream(), true); Buffered. Reader inu = new Buffered. Reader(new Input. Stream. Reader(System. in)); 19
Клиент И далее можно просто считывать данные из потока inu и записывать данные в out. while ((fuser = inu. read. Line()) != null) { out. println(fuser); fserver = in. read. Line(); System. out. println(fserver); if (fuser. equals. Ignore. Case("close")) break; if (fuser. equals. Ignore. Case("exit")) break; } 20