Перейти к основному содержимому

Взаимодействие по протоколу TCP

TCP (Transmission Control Protocol) — это один из основных протоколов сетевого уровня, обеспечивающий надежную передачу данных между приложениями в сети. TCP гарантирует доставку сообщений в правильном порядке, выполняет проверку целостности данных и автоматически восстанавливает потерянные пакеты. Этот протокол имеет широкую область применения, включающую сетевые приложения (в том числе веб-сервисы), электронную почту, передачу файлов и удаленный доступ.

Для работы с сетевыми соединениями по протоколу TCP используйте следующие типы:

  • СоединениеTcp — позволяет устанавливать клиентские TCP-соединения для взаимодействия с различными сетевыми сервисами (HTTP, FTP, SMTP, SSH и другими).
  • ВходящееСоединениеTcp — представляет входящее TCP-соединение, принятое сервером.
  • БлокирующийСерверTcp — реализует TCP-сервер для прослушивания входящих соединений и обмена данными. Может являться основной для реализации FTP-, HTTP-, SSH-серверов, а также произвольных протоколов на базе TCP.
  • ИсключениеTcp — исключение, которое выбрасывается при возникновении ошибки во время работы с TCP.
  • ИсключениеТаймаутаTcp — исключение, которое выбрасывается при превышении времени ожидания при работе с TCP.

Пример

Реализация TCP эхо-сервера

В данном примере показано создание простого эхо-сервера, который принимает входящее соединение от клиента, получает отправленные данные и возвращает их обратно без изменений.

Пример эхо-сервера
метод ЭхоСервер()
знч Разделитель = "\n"
// Создание TCP эхо-сервера
исп Сервер = новый БлокирующийСерверTcp(Адрес = "127.0.0.1", Порт = 5000)

// Ожидание входящего соединения
исп Соединение = Сервер.ОжидатьСоединения(30с)
// Получение данных от клиента
знч ЧтениеДанных = новый ЧтениеДанных(Соединение.ПолучитьПотокЧтения())
знч Сообщение = ЧтениеДанных.ПрочитатьСтроку(РазделительСтрок = Разделитель)

// Возврат данных клиенту
исп ПотокЗаписи = Соединение.ПолучитьПотокЗаписи()
ПотокЗаписи.Записать(Сообщение + Разделитель)
ПотокЗаписи.СброситьБуферы()
;
Пример клиента эхо-сервера
метод КлиентЭхоСервера()
знч Разделитель = "\n"
// Подключение к эхо-серверу по TCP
исп Соединение = новый СоединениеTcp(Адрес = "127.0.0.1", Порт = 5000)
знч ЧтениеДанных = новый ЧтениеДанных(Соединение.ПолучитьПотокЧтения())
// Отправка данных на сервер
исп ПотокЗаписи = Соединение.ПолучитьПотокЗаписи()
ПотокЗаписи.Записать("Hello" + Разделитель, Кодировка.Utf8)
ПотокЗаписи.СброситьБуферы()

// Получение ответа от сервера
знч Сообщение = ЧтениеДанных.ПрочитатьСтроку(Кодировка.Utf8, Разделитель) // Получено "Hello"
Консоль.Записать("Получено: %Сообщение")
;

Вы можете модифицировать вышеприведенный пример для создания эхо-сервера, который обрабатывает запросы от нескольких клиентов, используя один поток выполнения. Работа с каждым следующим клиентом начинается только после завершения обслуживания предыдущего.

Пример многоклиентского однопоточного эхо-сервера
метод МногоклиентскийЭхоСервер()
знч Разделитель = "\n"
// Создание TCP эхо-сервера
исп Сервер = новый БлокирующийСерверTcp(Адрес = "127.0.0.1", Порт = 5000)

// Последовательное ожидание клиентов
пока Истина
// Ожидание входящего соединения
исп Соединение = Сервер.ОжидатьСоединения(30с)
знч АдресКлиента = Соединение.ВСтроку()
Консоль.Записать("Подключен новый клиент: %АдресКлиента")

// Получение данных от клиента
знч ЧтениеДанных = новый ЧтениеДанных(Соединение.ПолучитьПотокЧтения())
знч Сообщение = ЧтениеДанных.ПрочитатьСтроку(РазделительСтрок = Разделитель)

// Возврат данных клиенту
исп ПотокЗаписи = Соединение.ПолучитьПотокЗаписи()
ПотокЗаписи.Записать(Сообщение + Разделитель)
ПотокЗаписи.СброситьБуферы()

Консоль.Записать("Клиент \"%АдресКлиента\" будет отключен")
Соединение.Закрыть()
;
;