Событие нового соединения TCP

From SunFlurry wiki
Revision as of 08:55, 7 February 2021 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  <OnTCPConnection> (Внешние события)
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Расположение:Любой глобальный модуль
Визуальность:Нет

Прерывающее событие, возникающее при соединении внешней программы по протоколу TCP к заранее инициализированному TCP серверу (см. Listen). Входящие соединения собираются в очередь и, в момент когда корневой поток становится доступным, для первого соединения из очереди вызывается данная функция, которая далее может производить обмен информацией с помощью функций TCP, используя аргумент TCP Объект. Последующие вызовы будут осуществлены только когда корневой поток закончит работу над предыдущими, поэтому более правильной стратегией будет передать работу с текущим соединением новому потоку с помощью вызова LoadModule.

Общее соединение TCP может использоваться для любых протоколов. Программа должна инициализировать серверный объект с указанием определенного порта, в момент поступления внешнего соединения, система создает новый TCP объект, привязанный к этому соединению и вызывает событие с именем, указанным в функции Listen (для упрощения будет называть его OnTCPConnection, однако, оно может иметь любое имя), с указанием этого нового объекта в аргументе функции. Дальнейшие действия зависят от типа протокола и информации. Чтобы включить на новом объекте шифрование требуется использование функции InitServerEncryption вместо клиентской версии InitEncryption, которая используется после соединения ConnectRaw.

Важно: имя функции (OnTCPConnection), указанное здесь, является примером. Вызываемая функция задается при вызове метода Listen и может иметь любое имя по выбору разработчика.

Синтаксис

<Событие нового соединения TCP>(<TCP Объект (IP Connection)>)

Аргументы

  • <TCP Объект (IP Connection)> - Объект TCP, для которого осуществлено соединение.

Примеры

Function OnTCPConnection(Соединение)
  Try
    If Соединение.HTTPReceiveHeader Then
      аДлина:=Number(Соединение.HTTPGetHeaderField("Content-Length"));
      тЗапрос:="";
      If (аДлина>0)And(аДлина<16384) Then
        //Получаем текст запроса
        тЗапрос:=Соединение.ReceiveStrRaw(аДлина);
      EndIf;
      //Убедимся, что полученный запрос это json
      If _And(тЗапрос<>"",Left(тЗапрос,1)="{",Right(тЗапрос,1)="}") Then        
        //Выполним запрос и получим результат в переменной тОтвет
        ...
        //Отправим назад ответ
        If тОтвет<>"" Then
          Соединение.HTTPClear(3);
          Соединение.HTTPSetOperation("HTTP/1.0 200 OK");
          Соединение.HTTPSetHeaderField("Date",FormatDate(GMTDate(),"N, DD M YYYY hh:tt:ss ""GMT""","en"));
          Соединение.HTTPSetHeaderField("Server","SF JSON server 1.0");
          Соединение.HTTPSetHeaderField("Last-Modified",FormatDate(GMTDate()-1,"N, DD M YYYY hh:tt:ss ""GMT""","en"));
          Соединение.HTTPSetHeaderField("Content-Length",Length(тОтвет));
          Соединение.HTTPSetHeaderField("Connection","close");
          Соединение.HTTPSetHeaderField("Content-Type","application/json");
          Соединение.HTTPSetBody(тОтвет);
          Соединение.HTTPSend();
        EndIf;
      EndIf;
    EndIf;
  Finally
    SuppressException();
    //При выходе разрываем связь
    Соединение.Disconnect();
  EndTry;
EndFunction;