Difference between revisions of "Событие нового соединения TCP"
m (1 revision imported) |
|
(No difference)
|
Latest revision as of 07:55, 7 February 2021
<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;