Чтение и запись.
Тип: TCPСерверДействие (ServerAction).
Возвращает или задает код для выполнения при получении нового сообщения.
Сервер.СерверПолучилДанные = Сервер.Действие(ЭтотОбъект, "Сервер_СерверПолучилДанные");
// Это пример запуска сервера блокирующего сценарий. // В качестве клиента удобно будет использовать 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