МногопоточныйTCPСервер.ОбработатьПриОшибкеСервера (MultithreadedTCPServer.ProcessingErrorServer) Метод

Синтаксис

ОбработатьПриОшибкеСервера(<АргументыСобытия>)

Параметры

АргументыСобытия (обязательный)
Тип: СобытиеСервераАрг (ServerEventArgs).

Возвращаемое значение

Описание

Метод создает событие ФормыДляОдноСкрипта.ПриОшибкеСервера (OneScriptForms.ErrorServer).

Примечание

Пример

Процедура ЗапускМногопоточногоСервера(параметр1) Экспорт
    Контекст = Новый Структура();
    Контекст.Вставить("Сервер", параметр1);
	Стр = "
	|
	|Процедура Сервер_ПриПодключенииКлиента() Экспорт
	|    Сервер.ОбработатьПриПодключенииКлиента(Сервер.АргументыСобытия);
	|КонецПроцедуры
	|
	|Процедура Сервер_ПриОтключенииКлиента() Экспорт
	|    Сервер.ОбработатьПриОтключенииКлиента(Сервер.АргументыСобытия);
	|КонецПроцедуры
	|
	|Процедура Сервер_СерверПолучилДанные() Экспорт
	|    Сервер.ОбработатьСерверПолучилДанные(Сервер.АргументыСобытия);
	|КонецПроцедуры
	|
	|Процедура Сервер_ПриОшибкеСервера() Экспорт
	|    Сервер.ОбработатьПриОшибкеСервера(Сервер.АргументыСобытия);
	|КонецПроцедуры
	|
	|Сервер.ПриПодключенииКлиента = Сервер.Действие(ЭтотОбъект, ""Сервер_ПриПодключенииКлиента"");
	|Сервер.ПриОтключенииКлиента = Сервер.Действие(ЭтотОбъект, ""Сервер_ПриОтключенииКлиента"");
	|Сервер.СерверПолучилДанные = Сервер.Действие(ЭтотОбъект, ""Сервер_СерверПолучилДанные"");
	|Сервер.ПриОшибкеСервера = Сервер.Действие(ЭтотОбъект, ""Сервер_ПриОшибкеСервера"");
	|Сервер.Начать();
	|
	|Пока Сервер.Продолжать Цикл
	|   Сервер.ПолучитьСобытие().Выполнить();
	|КонецЦикла;
	|";
	ЗагрузитьСценарийИзСтроки(Стр, Контекст);
КонецПроцедуры
Полный пример кода



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

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

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