Перед использованием сокета для связи с удаленными устройствами необходимо инициализировать сокет, указав протокол и сведения о сетевом адресе. Конструктор класса Socket имеет параметры, которые определяют семейство адресов, тип сокета и тип протокола, которые сокет использует для подключения. При подключении сокета клиента к сокету сервера клиент будет использовать IPEndPoint объект для указания сетевого адреса сервера.
Создание конечной точки IP-адреса
При работе с System.Net.Socketsвы представляете конечную точку сети в IPEndPoint виде объекта . Создается IPEndPoint с соответствующим номером IPAddress порта. Прежде чем начать беседу с помощью Socket, вы создадите канал данных между приложением и удаленным назначением.
В качестве уникального идентификатора службы протокол TCP/IP использует сетевой адрес и номер порта службы. Сетевой адрес идентифицирует конкретное сетевое назначение; номер порта определяет конкретную службу на этом устройстве, к которому нужно подключиться. Сочетание сетевого адреса и порта службы называется конечной точкой, которая представлена в .NET классом EndPoint . Потомок определяется для каждого поддерживаемого EndPoint семейства адресов; для семейства IP-адресов классом является IPEndPoint.
2 Java Client Server Socket — Как создать клиент-серверную программу через сокеты — для начинающих
Класс Dns предоставляет службы доменных имен для приложений, использующих интернет-службы TCP/IP. Метод GetHostEntryAsync запрашивает DNS-сервер для сопоставления понятного для пользователя доменного имени (например, «host.contoso.com») с числовым интернет-адресом (например 192.168.1.1 , ). GetHostEntryAsync возвращает объект Task , который при ожидании содержит список адресов и псевдонимов для запрошенного имени. В большинстве случаев можно использовать первый адрес из возвращенного массива AddressList. Следующий код получает объект , IPAddress содержащий IP-адрес сервера host.contoso.com .
IPHostEntry ipHostInfo = await Dns.GetHostEntryAsync(«host.contoso.com»); IPAddress ipAddress = ipHostInfo.AddressList[0];
Для ручного тестирования и отладки обычно можно использовать GetHostEntryAsync метод , чтобы получить заданное Dns.GetHostName() значение для разрешения имени localhost в IP-адрес.
Центр интернет-номеров (IANA) определяет номера портов для общих служб. Дополнительные сведения см. в разделе IANA: реестр имен служб и номеров портов транспортных протоколов). Другие службы могут использовать номера портов в диапазоне от 1024 до 65535. Следующий код объединяет IP-адрес для host.contoso.com с номером порта, чтобы создать удаленную конечную точку для подключения.
IPEndPoint ipEndPoint = new(ipAddress, 11_000);
После определения адреса удаленного устройства и выбора порта для подключения приложение может установить подключение к удаленному устройству.
Создание Socket клиента
Создав endPoint объект , создайте сокет клиента для подключения к серверу. После подключения сокета он может отправлять и получать данные из подключения к сокету сервера.
Сокеты в программировании. Пишем свой сервер и клиент.
using Socket client = new( ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); await client.ConnectAsync(ipEndPoint); while (true) < // Send message. var message = «Hi friends !<|EOM|>»; var messageBytes = Encoding.UTF8.GetBytes(message); _ = await client.SendAsync(messageBytes, SocketFlags.None); Console.WriteLine($»Socket client sent message: «»»); // Receive ack. var buffer = new byte[1_024]; var received = await client.ReceiveAsync(buffer, SocketFlags.None); var response = Encoding.UTF8.GetString(buffer, 0, received); if (response == «<|ACK|>») < Console.WriteLine( $»Socket client received acknowledgment: «»»); break; > // Sample output: // Socket client sent message: «Hi friends !<|EOM|>» // Socket client received acknowledgment: «<|ACK|>» > client.Shutdown(SocketShutdown.Both);
В приведенном выше коде C#:
- Создает экземпляр нового Socket объекта с заданным endPoint семейством адресов экземпляров , SocketType.Streamи ProtocolType.Tcp.
- Socket.ConnectAsync Вызывает метод с экземпляром в endPoint качестве аргумента.
- В цикле while :
- Кодирует и отправляет сообщение на сервер с помощью Socket.SendAsync.
- Записывает отправленное сообщение в консоль.
- Инициализирует буфер для получения данных с сервера с помощью Socket.ReceiveAsync.
- response Когда является подтверждением, он записывается в консоль, и цикл завершается.
Создание Socket сервера
Чтобы создать сокет сервера, объект может прослушивать входящие подключения по любому IP-адресу, endPoint но необходимо указать номер порта. После создания сокета сервер может принимать входящие подключения и взаимодействовать с клиентами.
using Socket listener = new( ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); listener.Bind(ipEndPoint); listener.Listen(100); var handler = await listener.AcceptAsync(); while (true) < // Receive message. var buffer = new byte[1_024]; var received = await handler.ReceiveAsync(buffer, SocketFlags.None); var response = Encoding.UTF8.GetString(buffer, 0, received); var eom = «<|EOM|>»; if (response.IndexOf(eom) > -1 /* is end of message */) < Console.WriteLine( $»Socket server received message: «»»); var ackMessage = «<|ACK|>»; var echoBytes = Encoding.UTF8.GetBytes(ackMessage); await handler.SendAsync(echoBytes, 0); Console.WriteLine( $»Socket server sent acknowledgment: «»»); break; > // Sample output: // Socket server received message: «Hi friends !» // Socket server sent acknowledgment: «<|ACK|>» >
В приведенном выше коде C#:
- Создает экземпляр нового Socket объекта с заданным endPoint семейством адресов экземпляров , SocketType.Streamи ProtocolType.Tcp.
- Вызывает listener Socket.Bind метод с экземпляром в endPoint качестве аргумента для связывания сокета с сетевым адресом.
- Метод Socket.Listen() вызывается для прослушивания входящих подключений.
- Вызывает listener метод для Socket.AcceptAsync принятия входящего подключения к сокету handler .
- В цикле while :
- Вызовы Socket.ReceiveAsync для получения данных от клиента.
- При получении данных они декодируются и записываются в консоль.
- response Если сообщение заканчивается на <|EOM|>, подтверждение отправляется клиенту с помощью Socket.SendAsync.
Запуск примера клиента и сервера
Сначала запустите серверное приложение, а затем запустите клиентское приложение.
dotnet run —project socket-server Socket server starting. Found: 172.23.64.1 available on port 9000. Socket server received message: «Hi friends !» Socket server sent acknowledgment: «<|ACK|>» Press ENTER to continue.
Клиентское приложение отправит сообщение серверу, а сервер ответит подтверждением.
dotnet run —project socket-client Socket client starting. Found: 172.23.64.1 available on port 9000. Socket client sent message: «Hi friends !<|EOM|>» Socket client received acknowledgment: «<|ACK|>» Press ENTER to continue.
Источник: learn.microsoft.com
Обмен данными по сети на основе сокетов в Java
Передача данных — одна из краеугольных задач информационных технологий. От неё зависит как работа компаний, так и повседневная жизнь обычных людей.
Для решения этой задачи Java предоставляет различные механизмы, среди которых особое место занимают сокеты.
Сокет (англ. socket — разъём) — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения (Википедия).
Ключевое отличие сокетов от других сетевых инструментов Java (таких как HttpRequest, SMTPTransport и др.) состоит в том, что:
- Сокеты представляют собой достаточно низкоуровневый интерфейс.
Это позволяет работать напрямую через протокол TCP/IP и тем самым обеспечивает универсальность. - Сокеты позволяют обеспечить обмен данными в режиме достаточно приближенном к реальному времени.
При отсутствии задержек при обработке и передачи данных обмен происходит с очень высокой скоростью.
Недостаток сокетов, по сути является продолжением их достоинств. Универсальность и работа на низком уровне неизбежно порождает неудобство при работе с распространёнными протоколами (того же HTTP) . Поэтому для них лучше использовать высокоуровневые средства. Но, подобные протоколы, к сожалению, не покрывают весь спектр задач сетевого программирования. Поэтому программирование на сокетах по-прежнему остаётся актуальным.
Ниже мы рассмотрим примеры создания и работы серверных и клиентских сокетов на примере несложного клиент-серверного приложения.
Серверная часть
Существует два вида сокетов. Серверные и клиентские. В этой части мы рассмотрим серверные сокеты.
Серверные сокеты реализуются на основе класса ServerSocket. Они прослушивают определённый порт и по получении данных от клиента могут сформировать и передать ответ.
Ниже приведён пример создания серверного сокета для 5000 порта.
Источник: streletzcoder.ru
Основы программирования сокетов в 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 хорошо расширен своими функциями, вы можете просто запустить обе программы на консоли.
Источник: java-blog.ru