Разработка сетевых приложений на Java
В лабораторной работе №5 необходимо реализовать сетевое приложение, использующее протоколы стека TCP/IP.
Указания к работе
Язык Java делает сетевое программирование простым благодаря наличию специальных средств и классов. Рассмотрим некоторые виды сетевых приложений. Internet-приложения включают Web-броузер, e-mail, сетевые новости, передачу файлов и telnet. Основные используемые протоколы – TCP и IP. Приложения клиент/сервер используют компьютер, выполняющий специальную программу – сервер, которая предоставляет услуги другим программам – клиентам. Клиент – это программа, получающая услуги от сервера. Клиент-серверные приложения основаны на использовании, в первую очередь, прикладных протоколов стека TCP/IP, таких как:
- HTTP – Hypertext Transfer Protocol (WWW);
- NNTP – Network News Transfer Protocol (группы новостей);
- SMTP – Simple Mail Transfer Protocol (посылка почты);
- POP3 – Post Office Protocol (чтение почты с сервера);
- FTP – File Transfer Protocol (протокол передачи файлов);
- TELNET – Удаленное управление компьютерами.
Каждый компьютер, работающий по протоколам стека TCP/IP имеет уникальный сетевой адрес. IP-адрес - это 32-битовое число, обычно записываемое как четыре числа, разделенные точками, каждое из которых изменяется от 0 до 255. IP-адрес может быть временным и выделяться динамически для каждого подключения или быть постоянным, как для сервера. Обычно при подключении к компьютеру вместо числового IP адреса используются символьные имена (например — www.example.com), называемые доменными именами. Специальная программа DNS (Domain Name Sever) преобразует имя домена в числовой IP-адрес. Получить IP-адрес в программе можно с помощью объекта класса InetAddress из пакета java.net.
Следующая программа демонстрирует, как получить IP-адрес из имени домена с помощью сервера имен доменов (DNS), к которому обращается метод getByName().
Будет выведено: IP-адрес –>omgtu.ru/195.69.204.35
Сокеты – это сетевые разъемы, через которые осуществляются двунаправленные поточные соединения между компьютерами. Сокет определяется номером порта и IP-адресом. При этом IP-адрес используется для идентификации компьютера, номер порта – для идентификации процесса, работающего на компьютере. Когда одно приложение знает сокет другого, создается сокетное соединение. Клиент пытается соединиться с сервером, инициализируя сокетное соединение. Сервер ждет, пока клиент не свяжется с ним. Первое сообщение, посылаемое клиентом на сервер, содержит сокет клиента. Сервер в свою очередь создает сокет, который будет использоваться для связи с клиентом, и посылает его клиенту с первым сообщением. После этого устанавливается коммуникационное соединение.
Сокетное соединение с сервером создается с помощью объекта класса Socket. При этом указывается IP-адрес сервера и номер порта (80 для HTTP). Если указано имя домена, то Java преобразует его с помощью DNS-сервера к IP-адресу:
Сервер ожидает сообщения клиента и должен быть запущен с указанием определенного порта. Объект класса ServerSocket создается с указанием конструктору номера порта и ожидает сообщения клиента с помощью метода accept(), который возвращает сокет клиента:
Клиент и сервер после установления сокетного соединения могут получать данные из потока ввода и записывать данные в поток вывода с помощью методов getInputStrеam() и getOutputStrеam() или к PrintStream для того, чтобы программа могла трактовать поток как выходные файлы.
В следующем примере для посылки клиенту строки "привет!" сервер вызывает метод getOutputStream() класса Socket. Клиент получает данные от сервера с помощью метода getInputStream(). Для разъединения клиента и сервера после завершения работы сокет закрывается с помощью метода close() класса Socket. В данном примере сервер посылает клиенту строку "привет!", после чего разрывает связь.
Аналогично клиент может послать данные серверу через поток вывода с помощью метода getOutputStream(), а сервер может получать данные с помощью метода getInputStream().
Если необходимо протестировать подобный пример на одном компьютере, можно выступать одновременно в роли клиента и сервера, используя статические методы getLocalHost() класса InetAddress для получения динамического IP-адреса компьютера, который выделяется при входе в Internet.
Задания к лабораторной работе
Создать на основе сокетов клиент/серверное визуальное приложение
- Клиент посылает через сервер сообщение другому клиенту.
- Клиент посылает через сервер сообщение другому клиенту, выбранному из списка.
- Чат. Клиент посылает через сервер сообщение, которое получают все клиенты. Список клиентов хранится на сервере в файле.
- Клиент при обращении к серверу получает случайно выбранный сонет Шекспира из файла.
- Сервер рассылает сообщения выбранным из списка клиентам. Список хранится в файле.
- Сервер рассылает сообщения в определенное время определенным клиентам.
- Сервер рассылает сообщения только тем клиентам, которые в настоящий момент находятся в on-line.
- Чат. Сервер рассылает всем клиентам информацию о клиентах вошедших в чат и покинувших его.
- Клиент выбирает изображение из списка и пересылает его другому клиенту через сервер.
- Игра по сети в «Морской бой».
- Игра по сети в «21».
- Игра по сети в классические «Крестики-нолики».
- Игра по сети в «Го» («крестики-нолики» на безразмерном (большом) поле. Для победы необходимо выстроить пять в один ряд).