softhelp.ru! | Программирование

Создание простого сервера на Java


Что же понадобится для написания серверного приложения? Всего пара сокетов. Да, пара, то есть два. ServerSocket, который ожидает запросов со стороны клиента (когда клиент выполняет new Socket()), и обычный Socket для общения с клиентом.

Как это работает.
Серверное приложение создает объект ServerSocket, указывая конкретный порт:

ServerSocket serverSock = new ServerSocket(4242);

Таким образом, сервер начинает отслеживать входящие клиентские запросы на порту 4242.


Клиент создает сокет и связывается с серверным приложением:

Socket sock = new Socket(”190.165.1.103"),

Клиент знает IP-адрес и номер порта (опубликованные или переданные ему настройщиком сервера).
Сервер создает новый сокет для общения с этим клиентом:

Socket sock = serverSock.accept();

Метод accept() блокирует программу, пока ожидает подключения клиентского сокета. Когда клиент наконец пытается подключиться, метод возвращает обычный объект Socket (на другом порту), который знает, как взаимодействовать с клиентом (то есть знает его IP-адрес и номер порта). Порт, на котором работает Socket, отличается от порта ServerSocket; поэтому ServerSocket может дальше отслеживать новые подключения.

Рекомендации по сокетам и серверам:

  • Клиентские и серверные приложения взаимодействуют с помощью сокетов.
  • Сокет — это соединение между двумя приложениями, которые могут работать на разных компьютерах (а могут и на одном).
  • Клиент должен знать IP-адрес (или доменное имя) и TCP-порт серверного приложения.
  • ТСР-порт — это 16-битное положительное число, которое присваивается конкретному серверному приложению. Благодаря номерам TCP-портов разные клиенты могут подключаться к одному компьютеру, но взаимодействовать на нем с разными приложениями.
  • Номера портов от 0 до 1023 зарезервированы для таких «общеизвестных сервисов», как HTTP, FTP, SMTP и т. д.
  • Клиент подключается к серверу, создавая сокет:
  • Sockets = new Socket("127.0.О.1", 4200);
  • Подключившись, клиент может работать с входящими и исходящими потоками, предоставляемыми сокетом. Это так называемые низкоуровневые потоки:
  • sock.getInputStream();
  • Чтобы прочитать данные, полученные от сервера, нужно создать объект BufferedReader и подключить его к InputStreamReader, который, в свою очередь, связан с входящим потоком из сокета.
  • Объект InputStreamReader — это «промежуточный» поток, который принимает байты и конвертирует их в текстовые (символьные) данные. Как правило, он используется в качестве связующего звена между высокоуровневым BufferedReader и низкоуровневым входящим потоком из сокета.
  • Чтобы записать текстовые данные на сервер, нужно создать объект PrintWriter, напрямую подключенный к исходящему потоку из сокета. Для отправки строки на сервер, достаточно воспользоваться методами print() или println().
  • На сервере используется ServerSocket, который ожидает поступления клиентских запросов на определенном порту.
  • Когда ServerSocket получает запрос, он его «принимает», создавая соединение с клиентом через объект Socket.