В этом разделе содержится полный исходный код для клиентских и серверных приложений TCP/IP:
- Полный код клиента Winsock
- Полный код сервера Winsock
Серверное приложение должно быть запущено до запуска клиентского приложения.
Чтобы выполнить сервер, скомпилируйте полный исходный код сервера и запустите исполняемый файл. Серверное приложение прослушивает TCP-порт 27015 для подключения клиента. После подключения клиента сервер получает данные от клиента и перенаправляет полученные данные обратно клиенту. Когда клиент завершает подключение, сервер завершает работу клиентского сокета, закрывает сокет и завершает работу.
Чтобы выполнить клиент, скомпилируйте полный исходный код клиента и запустите исполняемый файл. Клиентскому приложению требуется, чтобы имя компьютера или IP-адрес компьютера, на котором запущено серверное приложение, передавались в качестве параметра командной строки при выполнении клиента. Если клиент и сервер выполняются на образце компьютера, клиент можно запустить следующим образом:
КЛИЕНТ-СЕРВЕРНОЕ ПРИЛОЖЕНИЕ НА PYTHON | ЧАСТЬ 1 | СВЯЗЬ КЛИЕНТА И СЕРВЕРА
client localhost
Клиент пытается подключиться к серверу через TCP-порт 27015. После подключения клиент отправляет данные на сервер и получает все данные, отправляемые обратно с сервера. Затем клиент закрывает сокет и завершает работу.
Источник: learn.microsoft.com
Клиент-сервер на Java
Это первое приложение в односторонней связи. В случае односторонней связи клиент отправляет на сервер, но сервер не отправляет обратно клиенту. При двусторонней связи клиент отправляет на сервер, а сервер отправляет обратно клиенту.
Всего в приложении TCP / IP 4 варианта.
1st application | Client to server communication (one-way) |
2nd application | Server to client communication (one-way) |
3rd application | Server sends file contents to client (two-way, non-continuous) |
4th application | Chat program (two-way, continuous) |
1-е Приложение клиент-сервер
Приложение состоит из двух программ. Клиентская программа, работающая на стороне клиента, и серверная программа, работающая на стороне сервера. Клиентская программа WishesClient.java отправляет серверу наилучшие пожелания, а серверная программа WishesServer.java получает сообщение и печатает на своем терминале (мониторе).
Клиентская программа – WishesClient.java
import java.net.Socket; import java.io.OutputStream; import java.io.DataOutputStream; public class WishesClient < public static void main(String args[]) throws Exception < Socket sock = new Socket(«127.0.0.1», 5000); String message1 = «Accept Best Wishes, Serverji»; OutputStream ostream = sock.getOutputStream(); DataOutputStream dos = new DataOutputStream(ostream); dos.writeBytes(message1); dos.close(); ostream.close(); sock.close(); >> Socket sock = new Socket («127.0.0.1», 5000);
Конструктор класса Socket принимает два параметра – строку, IP-адрес сервера и целое число, номер порта на сервере, к которому клиент хотел бы подключиться. 127.0.0.1 – это адрес по умолчанию локальной системы в компьютерных сетях.
Socket или как создать собственный сервер на Python в домашних условиях #1 | Базовый курс Python
OutputStream ostream = sock.getOutputStream ();
Метод getOutputStream() класса Socket возвращает объект OutputStream, здесь объект является ostream. Это отправная точка всего общения (программы). Здесь сокет связан с потоками. Потоки способствуют передаче данных.
DataOutputStream dos = new DataOutputStream (ostream); dos.writeBytes (message1);
OutputStream является абстрактным классом; он не может быть использован напрямую. В приведенном выше коде он связан с конкретным классом DataOutputStream. Метод writeBytes() объекта DataOutputStream принимает строковое сообщение и передает его в Socket. Теперь клиентский сокет отправляется на другой сокет на сервере.
Когда работа закончится, закройте потоки и сокет. Он освобождает дескрипторы (ссылки), связанные с системными ресурсами.
Ниже приведены исключения в вышеприведенной программе, создаваемые конструктором и различными методами.
- Socket(“127.0.0.1”, 5000) выдает UnknownHostException
- getOutputStream() генерирует IOException
- writeBytes (message1) выдает IOException
- Все методы close() выдают IOException
- Серверная программа – WishesServer.java
import java.net.ServerSocket; import java.net.Socket; import java.io.InputStream; import java.io.DataInputStream; public class WishesServer < public static void main(String args[]) throws Exception < ServerSocket sersock = new ServerSocket(5000); System.out.println(«server is ready»); // message to know the server is running Socket sock = sersock.accept(); InputStream istream = sock.getInputStream(); DataInputStream dstream = new DataInputStream(istream); String message2 = dstream.readLine(); System.out.println(message2); dstream .close(); istream.close(); sock.close(); sersock.close(); >>
ServerSocket sersock = новый ServerSocket (5000);
У сервера есть два задания: одно, как и ожидалось, должно связываться, а другое связывает соединение с номером порта 5000. Для связи он использует Socket, а для привязки – ServerSocket.
Связывание – это не что иное, как выделение номера порта клиенту так долго, как ему хотелось бы; Между тем, если какой-либо другой клиент запрашивает номер порта 5000, он не должен выделяться сервером. Когда клиент отключается, порт освобождается и может быть предоставлен другому клиенту сервером.
Socket sock = sersock.accept ();
accept() – это метод класса ServerSocket, используемый сервером для привязки соединения по номеру порта 5000, запрошенного клиентом.
InputStream istream = sock.getInputStream();
Метод getInputStream() объекта Socket возвращает объект InputStream, и это отправная точка серверной программы. Сервер использует входной поток при получении сообщения.
DataInputStream dstream = new DataInputStream (istream);
Поскольку InputStream является абстрактным классом, его нельзя использовать напрямую. Он связан с конкретным классом DataInputStream.
String message2 = dstream.readLine();
Метод readLine() объекта DataInputStream читает строку сообщения из сокета и возвращает ее. Это сообщение печатается на консоли.
Примечание. При компиляции этой программы вы получаете предупреждение из-за метода readLine() объекта DataInutStream; но программа выполняется. Чтобы избежать этого предупреждения, в следующей программе используется BufferedReader.
Выполнение клиентских и серверных программ
В одной системе, чтобы действовать как клиент и сервер, откройте два шDOS и обработайте одно как клиент, а другой – как сервер. Из одного приглашения DOS сначала запустите серверную программу, а из другого приглашения DOS запустите клиентскую программу. Вы получаете вывод при запросе сервера DOS.
Это приложение и следующее – только односторонняя связь, отправляющая или получающая. Но второй набор (после следующего) приложений является двусторонним, когда клиент и сервер могут отправлять и получать (оба). Для тестирования на выделенных серверах, можно обратиться сюда https://www.mixtelecom.ru/arenda-serverov.html
Для лучшего понимания вопрос-ответ из пакета java.lang.
Сколько существует типов внутренних классов?
Ответ: 4 типа.
Что такое файлы JAR?
Ответ: JAR-файл – это заархивированный файл, сжатый JVM.
Как преобразовать строку в форму типа данных?
Ответ: Преобразование строки в тип данных – байтовое, короткое, целое, длинное, плавающее, двойное, символьное и логическое.
Как преобразовать объект в строку?
Ответ: Объект в строку – toString()
Как сравнить два объекта?
Ответ: Сравнение объектов – hashCode() https://hr-vector.com/java/klient-server» target=»_blank»]hr-vector.com[/mask_link]
Как написать программу клиент сервер
Класс Socket применяется не только для создания tcp-клиента, но для определения tcp-сервера. Общая схема работы серверного сокета TCP будет следующей:
Привязка к конечной точке. Метод Bind
Вначале серверный сокет с помощью метода Bind связывается с локальной точкой. В качестве параметра этот метод принимает локальную точку EndPoint, на которой сокет будет принимать подключения от клиентов:
public void Bind (EndPoint localEP);
Если не имеет значения, на каком именно локальном адресе сервер будет запущен, то можно в качестве адреса использовать значение IPAddress.Any . Тогда серверу будет назначен наиболее подходящий сетевой адрес (при наличии нескольких сетевых интерфейсов). Кроме того, если номер порта не имеет значения, то в качестве порта можно указать число 0. Тогда серверу будет предоставлен один из доступных портов. При использовании такого подхода точный адрес и порт затем можно будет получить через свойство LocalEndpoint .
using System.Net; using System.Net.Sockets; IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 8888); using Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(ipPoint); // связываем с локальной точкой ipPoint // получаем конечную точку, с которой связан сокет Console.WriteLine(socket.LocalEndPoint); // 0.0.0.0:8888
В этом примере сокет будет прослушивать подключения по 8888 порту на любых локальных адресах. То есть клиент должен будет подключаться к локальному адресу, например, к 127.0.0.1, и порту 8888.
Прослушивание подключений. Метод Listen
Для запуска прослушивания подключений на выбранной локальной конечной точке применяется метод Listen :
public void Listen (); public void Listen (int backlog);
При обращении к серверу входящие подключения помещаются в очередь для последующей обработки. По умолчанию эта очередь допускает 2147483647 подключений. Вторая версия метода Listen через параметр позволяет переопределить длину очереди.
stem.Net; using System.Net.Sockets; IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 8888); using Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(ipPoint); // связываем с локальной точкой ipPoint socket.Listen(1000); // запускаем прослушивание // количество входящих подключений, которые можно поместить в очередь, равно 1000
Подключение клиента
После начала прослушивания сокет готов принимать подключения. Для приема подключений применяются методы Accept()/AcceptAsync() . Эти методы имеют ряд перегруженных версий. Отмечу саму простую из них:
public Task AcceptAsync ();
Все версии методов Accept()/AcceptAsync() в качестве результа возвращают объект Socket, который инкапсулирует входящее подключение, то есть по сути представляет подключенного клиента.
using System.Net; using System.Net.Sockets; IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 8888); using Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(ipPoint); socket.Listen(); Console.WriteLine(«Сервер запущен. Ожидание подключений. «); // получаем входящее подключение using Socket client = await socket.AcceptAsync(); // получаем адрес клиента Console.WriteLine($»Адрес подключенного клиента: «);
Через свойства Socket можно получить информацию о подключении клиента, в частности, свойство RemoteEndPoint позволяет получить адрес подключенного клиента.
Для такого просто сервера для теста определим клиент. Возьмем новый проект консольного приложения на C# и определим в нем следующий код:
using System.Net.Sockets; using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try < await socket.ConnectAsync(«127.0.0.1″, 8888); Console.WriteLine($»Подключение к установлено»); > catch (SocketException) < Console.WriteLine($»Не удалось установить подключение с «); >
Здесь в метод ConnectAsync передаем данные конечной точки сервера и при успешном подключении выводим сообщение.
Запустим сервер, а затем запустим клиент. В итоге после подключения клиента к серверу в консоли сервера мы увидим что-то наподобие:
Сервер запущен. Ожидание подключений. Адрес подключенного клиента: 127.0.0.1:52767
В данном случае мы видим, что в моем случае для подключения к серверу сокет-клиент использует адрес 127.0.0.1:52767. А в консоли клиента отобразится сообщение об успешном подключении:
Подключение к 127.0.0.1:8888 установлено
Источник: metanit.com