МногопоточныйTCPСервер.ПроверятьАктивностьКлиента (MultithreadedTCPServer.CheckClientActivity) Свойство

Использование

Чтение и запись.

Значение

Тип: Булево.

Возвращает или задает значение, показывающее, следует ли проверять активность клиента отправкой сообщения "PING" через определенный интервал времени.

Примечание

Требуется перезапуск сервера. Значение по умолчанию - Ложь.

Желательно устанавливать это свойство в значение Истина. При работе с некорректными, зависшими клиентами они будут отключены.

Если на клиенте не желателен вывод сообщения "PING", поставьте на него фильтр, блокирующий вывод.

Пример

Сервер.ПроверятьАктивностьКлиента = Истина;
Полный пример кода


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

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

Библиотека MultithreadedTCPServer