МногопоточныйTCPСервер (MultithreadedTCPServer) Конструктор

Синтаксис

МногопоточныйTCPСервер(<НомерПорта>)

Параметры

НомерПорта (обязательный)
Тип: Число.
Прослушиваемый TCP-порт для входящих запросов на подключение на сервере.

Описание

Создаёт новый экземпляр класса МногопоточныйTCPСервер (MultithreadedTCPServer).

Примечание

Цикл ожидания событий сервера остановит выполнение скрипта. Если нужно продолжение выполнения скрипта после запуска сервера создавайте сервер через метод ФормыДляОдноСкрипта.ФоновыйМногопоточныйСервер (OneScriptForms.BackgroundMultithreadedServer).

В качестве клиента удобно будет использовать TCPКлиент (TCPClient). Пример смотрите в методе TCPКлиент.Отправить (TCPClient.Send).

Пример

Сервер = Ф.МногопоточныйTCPСервер(8080);
Полный пример кода



// Это пример запуска сервера блокирующего сценарий. // В качестве клиента удобно будет использовать TCPКлиент (TCPClient) Перем Ф, Сервер; Процедура Сервер_ПриПодключенииКлиента() Экспорт АргументыСобытия = Сервер.АргументыСобытия; Сообщить("Клиент подключился: " + АргументыСобытия.ИдентификаторКлиента); Сообщить("Активных клиентов: " + Сервер.КоличествоАктивныхКлиентов); Сообщить("========================"); КонецПроцедуры Процедура Сервер_ПриОтключенииКлиента() Экспорт АргументыСобытия = Сервер.АргументыСобытия; Сообщить("Клиент отключился: " + АргументыСобытия.ИдентификаторКлиента); Сообщить("Активных клиентов: " + Сервер.КоличествоАктивныхКлиентов); Сообщить("========================"); КонецПроцедуры Процедура Сервер_СерверПолучилДанные() Экспорт АргументыСобытия = Сервер.АргументыСобытия; Данные = АргументыСобытия.Данные; // Данные, полученные сервером, доступны нам как тип БуферДвоичныхДанных (BinaryDataBuffer) из OneScript. // Если с сервером будет взаимодействовать клиент, который формирует сообщения по оговоренным заранее правилам, // появляется возможность делить данные на отдельные сообщения и кроме того узнать тип данных отдельного сообщения. // Как частный случай можно на стороне клиента отправлять в сетевой поток сначала размер сообщения (четыре байта) // а затем само сообщение. ВывестиСообщение(Данные, АргументыСобытия.ИдентификаторКлиента); Сообщить("========================"); // Отправим БуферДвоичныхДанных. БДД = ПолучитьБуферДвоичныхДанныхИзСтроки("!!!Всем подключенным клиентам, ПРИВЕТ от " + АргументыСобытия.ИдентификаторКлиента); Сервер.ОтправитьВсем(БДД); // Отправим строку. Сервер.ОтправитьВсем(Символы.ПС + "Всем подключенным клиентам, ПРИВЕТ!!! от " + АргументыСобытия.ИдентификаторКлиента); КонецПроцедуры Процедура Сервер_ПриОшибкеСервера() Экспорт АргументыСобытия = Сервер.АргументыСобытия; Сообщить("ОшибкаСервера: " + АргументыСобытия.ОшибкаСервера); Сообщить("========================"); КонецПроцедуры Процедура ВывестиСообщение(Данные, ИдентификаторКлиента) Попытка // В случае передачи в потоке перед самим сообщением размера сообщения используем этот вариант. РазмерДанных = Данные.ПрочитатьЦелое32(0); ДанныеСообщения = Данные.Прочитать(4, РазмерДанных); ДД = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ДанныеСообщения); ОтдельноеСообщение = ПолучитьСтрокуИзДвоичныхДанных(ДД, КодировкаТекста.UTF8); Сообщить("Сообщение от " + ИдентификаторКлиента + " (" + РазмерДанных + " байт):" + Символы.ПС + ОтдельноеСообщение); Если (Данные.Размер - 4 - РазмерДанных) > 0 Тогда ОстатокДанных = Данные.Прочитать(4 + РазмерДанных, Данные.Размер - 4 - РазмерДанных); // Продолжаем делить данные на отдельные сообщения. ВывестиСообщение(ОстатокДанных, ИдентификаторКлиента); КонецЕсли; Исключение // В случае передачи в потоке никак не разделенных байтов используем этот вариант. ДанныеСообщения = Данные.Прочитать(0, Данные.Размер); ДД = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ДанныеСообщения); ОтдельноеСообщение = ПолучитьСтрокуИзДвоичныхДанных(ДД, КодировкаТекста.UTF8); Сообщить("Сообщение от " + ИдентификаторКлиента + " (" + Данные.Размер + " байт):" + Символы.ПС + ОтдельноеСообщение); КонецПопытки; // Можно предусмотреть другие способы разделения потока байтов на отдельные сообщения, например посылка символа перевода строки. КонецПроцедуры ПодключитьВнешнююКомпоненту("C:\444\111\OneScriptForms\OneScriptForms\bin\Debug\OneScriptForms.dll"); Ф = Новый ФормыДляОдноСкрипта(); Сервер = Ф.МногопоточныйTCPСервер(8080); Сервер.ПроверятьАктивностьКлиента = Истина; Сервер.ПриПодключенииКлиента = Сервер.Действие(ЭтотОбъект, "Сервер_ПриПодключенииКлиента"); Сервер.ПриОтключенииКлиента = Сервер.Действие(ЭтотОбъект, "Сервер_ПриОтключенииКлиента"); Сервер.СерверПолучилДанные = Сервер.Действие(ЭтотОбъект, "Сервер_СерверПолучилДанные"); Сервер.ПриОшибкеСервера = Сервер.Действие(ЭтотОбъект, "Сервер_ПриОшибкеСервера"); Сервер.Начать(); // Запускаем цикл событий сервера // Цикл ожидания событий сервера остановит выполнение скрипта. // Если нужно продолжение выполнения скрипта после запуска сервера создавайте сервер // через метод ФормыДляОдноСкрипта.ФоновыйМногопоточныйСервер (OneScriptForms.BackgroundMultithreadedServer). // А пока сервер настроен в режиме "Эхо", отправляет обратно клиенту его же сообщение. Пока Сервер.Продолжать Цикл Сервер.ПолучитьСобытие().Выполнить(); КонецЦикла;

Смотрите также

МногопоточныйTCPСервер (MultithreadedTCPServer) Класс | Библиотека OneScriptForms