Событие нового соединения TCP
| <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;