- Обмен данными по сети на основе сокетов в Java
- Основы программирования сокетов в Java
- Что это такое программирование сокетов?
- Что такое сокет?
- Клиентское программирование
- 1. Установите соединение
- 2. Связь
- 3. Закрытие соединения
- Пример реализации сокетного соединения на стороне клиента
- Программирование на стороне сервера
- Общение
- Закройте соединение
- Пример реализации сокетного соединения на стороне сервера
Обмен данными по сети на основе сокетов в Java
Передача данных — одна из краеугольных задач информационных технологий. От неё зависит как работа компаний, так и повседневная жизнь обычных людей.
Для решения этой задачи Java предоставляет различные механизмы, среди которых особое место занимают сокеты.
Сокет (англ. socket — разъём) — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения (Википедия).
Ключевое отличие сокетов от других сетевых инструментов Java (таких как HttpRequest, SMTPTransport и др.) состоит в том, что:
- Сокеты представляют собой достаточно низкоуровневый интерфейс.
Это позволяет работать напрямую через протокол TCP/IP и тем самым обеспечивает универсальность. - Сокеты позволяют обеспечить обмен данными в режиме достаточно приближенном к реальному времени.
При отсутствии задержек при обработке и передачи данных обмен происходит с очень высокой скоростью.
Недостаток сокетов, по сути является продолжением их достоинств. Универсальность и работа на низком уровне неизбежно порождает неудобство при работе с распространёнными протоколами (того же HTTP) . Поэтому для них лучше использовать высокоуровневые средства. Но, подобные протоколы, к сожалению, не покрывают весь спектр задач сетевого программирования. Поэтому программирование на сокетах по-прежнему остаётся актуальным.
Ниже мы рассмотрим примеры создания и работы серверных и клиентских сокетов на примере несложного клиент-серверного приложения.
Серверная часть
Существует два вида сокетов. Серверные и клиентские. В этой части мы рассмотрим серверные сокеты.
Серверные сокеты реализуются на основе класса ServerSocket. Они прослушивают определённый порт и по получении данных от клиента могут сформировать и передать ответ.
Ниже приведён пример создания серверного сокета для 5000 порта.
Основы программирования сокетов в Java
Программирование сокетов в Java используется для связи между приложениями, работающими на разных JRE. Он может быть ориентированным на соединение или без установления соединения. По сути, сокет – это способ установить соединение между клиентом и сервером.
Что это такое программирование сокетов?
Программирование сокетов – это способ соединения двух узлов в сети для связи друг с другом. Один сокет (узел) прослушивает определенный порт на IP-адресе, в то время как другой обращается к другому, чтобы сформировать соединение.
Сервер формирует слушателя, которого клиент обращается к серверу. Классы Socket и Server Socket используются для программирования сокетов с установлением соединения.
Что такое сокет?
Сокет – это одна из конечных точек двустороннего канала связи между двумя программами, работающими в сети. Привязан к номеру порта, чтобы уровень TCP мог идентифицировать приложение, в которое должны быть отправлены данные.
Теперь, когда вы знаете, что такое Socket в Java, давайте продолжим и разберемся, как клиент взаимодействует с сервером и как сервер отвечает в ответ.
Клиентское программирование
В случае программирования на стороне клиента клиент сначала будет ждать запуска сервера. Как только сервер будет запущен, он отправит запросы на сервер. После этого клиент будет ждать ответа от сервера. Итак, в этом вся логика взаимодействия клиента и сервера.
Чтобы инициировать запрос клиентов, вам необходимо выполнить следующие шаги:
1. Установите соединение
Самый первый шаг – установить соединение через сокет. Соединение через сокет подразумевает, что две машины имеют информацию о сетевом расположении друг друга (IP-адрес) и TCP-порте.
Вы можете создать Socket с помощью следующего оператора:
Socket socket = new Socket («127.0.0.1», 5000)
- Здесь первый аргумент представляет собой IP-адрес сервера.
- Второй аргумент представляет TCP-порт (число, обозначающее, какое приложение должно работать на сервере).
2. Связь
Для связи через соединение сокета потоки используются как для ввода, так и для вывода данных. После установления соединения и отправки запросов вам необходимо закрыть соединение.
3. Закрытие соединения
Соединение сокета явно закрывается после отправки сообщения на сервер.
Пример реализации сокетного соединения на стороне клиента
// A Java program for a ClientSide import java.net.*; import java.io.*; public class ClientProgram < // initialize socket and input output streams private Socket socket = null; private DataInputStream input = null; private DataOutputStream out = null; // constructor to put ip address and port public Client(String address, int port) < // establish a connection try < socket = new Socket(address, port); System.out.println("Connected"); // takes input from terminal input = new DataInputStream(System.in); // sends output to the socket out = new DataOutputStream(socket.getOutputStream()); >catch(UnknownHostException u) < System.out.println(u); >catch(IOException i) < System.out.println(i); >// string to read message from input String line = ""; // keep reading until "Over" is input while (!line.equals("Over")) < try < line = input.readLine(); out.writeUTF(line); >catch(IOException i) < System.out.println(i); >> // close the connection try < input.close(); out.close(); socket.close(); >catch(IOException i) < System.out.println(i); >> public static void main(String args[]) < Client client = new Client("127.0.0.1", 5000); >>
Программирование на стороне сервера
По сути, сервер создает экземпляр своего объекта и ждет запроса клиента. Как только клиент отправит запрос, сервер ответит на него.
Для кодирования серверного приложения вам понадобятся два сокета, и они следующие:
- ServerSocket, который ожидает клиентских запросов (когда клиент создает новый Socket()).
- Обычный старый сокет для связи с клиентом.
После этого вам нужно связаться с клиентом с ответом.
Общение
getOutputStream() используется для отправки вывода через сокет.
Закройте соединение
Когда все будет сделано, важно закрыть соединение, закрыв сокет, а также потоки ввода / вывода.
Пример реализации сокетного соединения на стороне сервера
// A Java program for a Serverside import java.net.*; import java.io.*; public class ServerSide < //initialize socket and input stream private Socket socket = null; private ServerSocket server = null; private DataInputStream in = null; // constructor with port public Server(int port) < // starts server and waits for a connection try< server = new ServerSocket(port); System.out.println("Server started"); System.out.println("Waiting for a client . "); socket = server.accept(); System.out.println("Client accepted"); // takes input from the client socket in = new DataInputStream( new BufferedInputStream(socket.getInputStream())); String line = ""; // reads message from client until "Over" is sent while (!line.equals("Over")) < try < line = in.readUTF(); System.out.println(line); >catch(IOException i) < System.out.println(i); >> System.out.println("Closing connection"); // close connection socket.close(); in.close(); > catch(IOException i) < System.out.println(i); >> public static void main(String args[]) < Server server = new Server(5000); >>
После настройки как клиентской, так и серверной стороны вы можете сначала запустить программу на стороне сервера. После этого вам необходимо запустить клиентскую программу и отправить запрос. Как только запрос будет отправлен со стороны клиента, сервер ответит вам.
1. Когда вы запускаете сценарий на стороне сервера, он запускается и ждет, пока клиент не запустится.
2. Затем клиент подключается и вводит запрос в виде строки.
3. Когда клиент отправляет запрос, сервер отвечает.
Вот как вам нужно выполнить программу сокета на Java. Вы также можете запускать эти программы в окне терминала или в командной строке. Но, поскольку Eclipse хорошо расширен своими функциями, вы можете просто запустить обе программы на консоли.