Разработка сетевых приложений на 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.
import java.net.*; public class MyLocal { public static void main(String[] args) { InetAddress myIP = null; try { myIP = InetAddress.getLocalHost(); } catch (UnknownHostException e) { System. out.println( " ошибка доступа ->" + e); } System. out.println( " Мой IP ->" + myIP); }
Следующая программа демонстрирует, как получить IP-адрес из имени домена с помощью сервера имен доменов (DNS), к которому обращается метод getByName().
import java.net.*; public class IPfromDNS { public static void main(String[] args) { InetAddress omgtu = null; try { omgtu = InetAddress.getByName("omgtu.ru"); } catch (UnknownHostException e) { System.out.println( " ошибка доступа ->" + e); } System.out.println( "IP- адрес ->" + omgtu ); } }
Будет выведено: IP-адрес –>omgtu.ru/195.69.204.35
Сокеты – это сетевые разъемы, через которые осуществляются двунаправленные поточные соединения между компьютерами. Сокет определяется номером порта и IP-адресом. При этом IP-адрес используется для идентификации компьютера, номер порта – для идентификации процесса, работающего на компьютере. Когда одно приложение знает сокет другого, создается сокетное соединение. Клиент пытается соединиться с сервером, инициализируя сокетное соединение. Сервер ждет, пока клиент не свяжется с ним. Первое сообщение, посылаемое клиентом на сервер, содержит сокет клиента. Сервер в свою очередь создает сокет, который будет использоваться для связи с клиентом, и посылает его клиенту с первым сообщением. После этого устанавливается коммуникационное соединение.
Сокетное соединение с сервером создается с помощью объекта класса Socket. При этом указывается IP-адрес сервера и номер порта (80 для HTTP). Если указано имя домена, то Java преобразует его с помощью DNS-сервера к IP-адресу:
try { Socket socket = new Socket("localhost", 8030); } catch (IOException e) { System. out.println( " ошибка : " + e); }.
Сервер ожидает сообщения клиента и должен быть запущен с указанием определенного порта. Объект класса ServerSocket создается с указанием конструктору номера порта и ожидает сообщения клиента с помощью метода accept(), который возвращает сокет клиента:
Socket socket = null ; try { ServerSocket server = new ServerSocket(8030); socket = server.accept(); } catch (IOException e) { System. out.println( " ошибка : " + e); }.
Клиент и сервер после установления сокетного соединения могут получать данные из потока ввода и записывать данные в поток вывода с помощью методов getInputStrеam() и getOutputStrеam() или к PrintStream для того, чтобы программа могла трактовать поток как выходные файлы.
В следующем примере для посылки клиенту строки "привет!" сервер вызывает метод getOutputStream() класса Socket. Клиент получает данные от сервера с помощью метода getInputStream(). Для разъединения клиента и сервера после завершения работы сокет закрывается с помощью метода close() класса Socket. В данном примере сервер посылает клиенту строку "привет!", после чего разрывает связь.
// передача клиенту строки : MyServerSocket. java import java.io.*; import java.net.*; public class MyServerSocket { public static void main(String[] args) throws Exception { Socket s = null; try { // посылка строки клиенту ServerSocket server = new ServerSocket(8030); s = server.accept(); PrintStream ps = new PrintStream(s.getOutputStream()); ps.println( " привет !" ); ps.flush(); s.close(); // разрыв соединения } catch (IOException e) { System. out.println( " ошибка : " + e); } } } /* получение клиентом строки : MyClientSocket. java */ import java.io.*; import java.net.*; public class MyClientSocket { public static void main(String[] args) { Socket socket = null; try {// получение строки клиентом socket = new Socket( " имя _ компьютера " , 8030); BufferedReader dis = new BufferedReader(new InputStreamReader( socket.getInputStream())); String msg = dis.readLine(); System.out.println(msg); } catch (IOException e) { System. out.println( " ошибка : " + e); } } }
Аналогично клиент может послать данные серверу через поток вывода с помощью метода getOutputStream(), а сервер может получать данные с помощью метода getInputStream().
Если необходимо протестировать подобный пример на одном компьютере, можно выступать одновременно в роли клиента и сервера, используя статические методы getLocalHost() класса InetAddress для получения динамического IP-адреса компьютера, который выделяется при входе в Internet.
Задания к лабораторной работе
Создать на основе сокетов клиент/серверное визуальное приложение
- Клиент посылает через сервер сообщение другому клиенту.
- Клиент посылает через сервер сообщение другому клиенту, выбранному из списка.
- Чат. Клиент посылает через сервер сообщение, которое получают все клиенты. Список клиентов хранится на сервере в файле.
- Клиент при обращении к серверу получает случайно выбранный сонет Шекспира из файла.
- Сервер рассылает сообщения выбранным из списка клиентам. Список хранится в файле.
- Сервер рассылает сообщения в определенное время определенным клиентам.
- Сервер рассылает сообщения только тем клиентам, которые в настоящий момент находятся в on-line.
- Чат. Сервер рассылает всем клиентам информацию о клиентах вошедших в чат и покинувших его.
- Клиент выбирает изображение из списка и пересылает его другому клиенту через сервер.
- Игра по сети в «Морской бой».
- Игра по сети в «21».
- Игра по сети в классические «Крестики-нолики».
- Игра по сети в «Го» («крестики-нолики» на безразмерном (большом) поле. Для победы необходимо выстроить пять в один ряд).
CC-BY-CA Юдин Е.Б., 28.01.2013