Nový vestavěný server Websocket

Automaticky přeloženo z Deepl

Ve stále propojenějším světě musí být webové stránky nebo aplikace IoT aktualizovány v reálném čase.

Způsobem, jak okamžitě doručit informace na vaše weby, je použití protokolu Websocket, který poskytuje plně duplexní komunikační kanál mezi serverem a klientem. Z verze v20 poskytuje 4D příkazy pro vytvoření serveru Websocket.

Příkazy pro vytvoření serveru Websocket

Pro správu websocketového serveru poskytuje 4D 2 nové třídy:

  • První spravuje samotný server, 4D.WebSocketServer
  • Druhá spravuje websocketová spojení: 4D.WebSocketConnection

 

Pro demonstraci této funkce vytvořme jednoduchý chatovací server!

Před použitím třídy websocketového serveru musí být váš webový server 4D spuštěn!

4D.WebSocketServer

Tato třída umožňuje spravovat různé události, které na serveru nastanou. K tomu je třeba vytvořit třídu s níže uvedenými funkcemi:

  • onConnection(), která se volá při požadavku na nové spojení.
  • onOpen(), volaná při spuštění serveru
  • onTerminate(), volaná při zastavení serveru
  • onError(), volaná při výskytu chyby.

V našem příkladu potřebujeme nejprve spravovat požadavek na připojení. Pomocí funkce onConnection() můžeme zrušit spojení tak, že vrátíme Null nebo objekt, který bude použit pro správu odeslané nebo přijaté zprávy. V následujícím příkladu vracíme třídu WSConnectionHandler (popsanou v následující části):

Funkce onConnection($wss : Object; $param : Object) : Object
 // zavoláme metodu VerifyAddress, abychom ověřili, zda je vzdálená adresa povolena pro připojení
If (VerifyAddress($param.request.remoteAddress))
// Připojení je povoleno
// Vrácený objekt WSConnectionHandler použije 
// 4D k instanci 4D.WebSocketConnection
// vztahující se k tomuto spojení
return cs.WSConnectionHandler.new() 
Else 
// Spojení je zrušeno
return Null 
End if 

Nyní chceme zaznamenávat zahájení, ukončení a chyby, proto vytvoříme třídu WSServerHandler:

Třída constructor

Function onOpen($wss : Object; $param : Object)
LogFile("*** Server spuštěn")

Function onTerminate($wss : Object; $param : Object)
LogFile("*** Server uzavřen")

Function onError($wss : Object; $param : Object)
LogFile("!!! Chyba serveru: "+$param.statusText)

4D.WebSocketConnection

Tato třída umožňuje spravovat různé události během daného spojení. K tomu je třeba vytvořit třídu s níže uvedenými funkcemi:

  • onMessage(), která se volá pokaždé, když přes toto spojení přijde zpráva.
  • onOpen(), volaná při vytvoření objektu 4D.WebSocketConnection.
  • onTerminate(), volaná při ukončení objektu 4D.WebSocketConnection.
  • onError(), volaná při výskytu chyby

 

Pro náš chat bude tato třída třídou WSConnectionHandler. Je to :

  • upozorní ostatní uživatele, že je připojen nový uživatel, když je spojení otevřeno
  • varuje ostatní uživatele, že je uživatel odpojen, když je spojení ukončeno
  • vysílá přijaté zprávy všem ostatním připojeným klientům chatu, když je přijata zpráva.

 

Funkce onMessage($ws : 4D.WebSocketConnection; $message : Object)
// znovu odešle zprávu všem chatovacím klientům
This.broadcast($ws;$message.data)

Funkce onOpen($ws : 4D.WebSocketConnection; $message : Object)
// odeslání zprávy nově připojenému uživateli 
$ws.send("Vítejte na chatu!")
// odeslání zprávy "Nový klient připojen" všem ostatním klientům chatu
This.broadcast($ws; "Nový klient připojen")

Function onTerminate($ws : 4D.WebSocketConnection; $message : Object)
// Pošle zprávu "Klient odpojen" všem ostatním klientům chatu
This.broadcast($ws; "Klient odpojen")

Function broadcast($ws : 4D.WebSocketConnection; $message : Text)
var $client:4D.WebSocketConnection
// znovu odešle zprávu všem klientům chatu
For each ($client; $ws.wss.connections)
// Ověří, že id není aktuální spojení
If ($client.id#$ws.id)
$client.send($message)
End if 
End for each 

Zbývá už jen spustit websocketový server pomocí výše vytvořených tříd. Websocketový server musí být spuštěn v pracovním stroji, takže vytvoříme nový proces příkazem CALL WORKER a instancujeme v něm 4D.WebSocketServer:

$handler:cs.WSSHandler
$handler:=cs.WSServerHandler.new()

CALL WORKER("WebSocketServer"; Formula(WSS:=4D.WebSocketServer.new($handler)))
//Přiřazení proměnné (WSS) k WebSocketu umožňuje následné volání WSS.terminate()

Vytvořený webový server bude existovat, dokud nebude pracovník ukončen nebo dokud nebude zavolána funkce .terminate().

CALL WORKER("WebSocketServer"; Formula(WSS.terminate()))

Na straně klienta

Níže najdete příklad kódu v jazycích HTML a Javascript pro vytvoření rozhraní chatu:

Tento kód je určen pro práci s místním webovým serverem na portu HTTP 80 (řádek 18: const urlwss=“ws://127.0.0.1:80/“;).

Podívejte se na tuto funkci s výše uvedeným HDI a na dokumentaci, kde najdete další podrobnosti!

Fabrice Mainguené
- Product Owner -Fabrice Mainguené se připojil k týmu 4D Program v listopadu 2016. Jako Product Owner má na starosti psaní uživatelských příběhů, které následně převádí do funkčních specifikací. Jeho úkolem je také zajistit, aby dodaná implementace funkcí splňovala potřeby zákazníků.Po získání bakalářského titulu v oboru informatiky na CNAM nastoupil Fabrice do malé softwarové vydavatelské společnosti jako vývojář Windev. Poté pracoval pro různé společnosti v oblasti průmyslu a obchodu jako vývojář aplikací Windev a webových aplikací a také jako technický poradce pro nové funkce.