#dim sock As %IO.ServerSocket = ##class ( %IO.ServerSocket ). %New ()
set sock. TranslationTable = "UTF8"
write #, " ..." , !
#; : pPort, pTimeout, pSC
do sock. Open (7001, 1, .sc)
if $$$ISOK (sc) {
do sock. Listen ()
do {
#; : pMaxReadLen, pTimeout
set s=sock. ReadAny (250, 5)
write s,!
#; : pData, pFlush
do sock. Write ( $$$FormatText ( " %1" , $$$quote (s)), $$$YES )
} while (s'= "bye!" )
do sock. Close ()
write " ..." , !
}
#dim sock As %IO.ServerSocket = ##class ( %IO.Socket ). %New ()
set sock. TranslationTable = "UTF8"
write #, " ..." , !
#; : pHost, pPort, pTimeout, pSC
do sock. Open ( "127.0.0.1" , "7001" ,1,.sc)
if $$$ISOK (sc) {
#; : pData, pFlush
do sock. Write ( " " , $$$YES )
#; : pMaxReadLen, pTimeout
write sock. ReadAny (250, 5),!
hang 2
do sock. Write ( "bye!" , $$$YES )
write sock. ReadAny (250, 5),!
do sock. Close ()
write " ..." , !
}
... bye! ...
... " " "bye!" ...
Class demo.socket Extends %RegisteredObject
{
ClassMethod Server2()
{
#; do ##class(demo.socket).Server2()
#dim sock As %IO.ServerSocket = ##class ( %IO.ServerSocket ). %New ()
write #, " ..." , !
do sock. Open (10081, 1, .sc)
if $$$ISOK (sc) {
do sock. Listen (-1, .sc)
do {
set s=sock. ReadAny ( $$$MaxLocalLength ,, .sc)
write s,!
do sock. Write (s, $$$YES , .sc)
} while (s'= "bye!" )
do sock. Close ()
write " ..." , !
}
}
ClassMethod Client2( end As %Boolean = { $$$NO })
{
#; do ##class(demo.socket).Client2(1)
#dim sock As %IO.ServerSocket = ##class ( %IO.Socket ). %New ()
write #, " ..." , !
do sock. Open ( "127.0.0.1" , "10081" ,1,.sc)
if $$$ISOK (sc) {
set time= $zhorolog
for i=1:1:10 {
do sock. Write ( "1234567890" , $$$YES , .sc)
set s=sock. ReadAny ( $$$MaxLocalLength ,, .sc)
write s,!
}
write "= " , $zhorolog -time, " ." ,!
do :end sock. Write ( "bye!" , $$$YES , .sc)
do sock. Close ()
write " ..." , !
} else {
write $system .Status . GetErrorText (sc, "ru" ),!
}
}
}
Note: The source code for implementing the WebSocket protocol in Caché ObjectScript is for informational purposes only.
/// .
Class demo.Server Extends net.WebSocketEvents
{
/// onbeforeconnect.
/// <br> .
Method onbeforeconnect() As %Boolean
{
set ^tmp( $i (^tmp), "onbeforeconnect" )= $lb (.. WebSocketGET ,.. WebSocketHost ,.. WebSocketOrigin ,.. WebSocketVer )
q $$$YES
}
/// onconnect.
Method onconnect()
{
set ^tmp( $i (^tmp), "onconnect" )= ""
}
/// onmessage.
/// <br> :
/// <br><var>msg</var> - , .
Method onmessage( msg As %String )
{
set ^tmp( $i (^tmp), "onmessage" )=msg
#; .
/*
do ..send("Cachéasd"_$random(1000)):msg="get",
..send($replace($j("",32000)," ","é")):msg="getBig",
..sendBroadcast("from Caché to All"):msg="toAll",
..sendBroadcast($$$FormatText(" : %1",$$$quote($p(msg,"^",2)))):$e(msg)="^"
*/
if msg= "get" {
do .. send ( "Cachéasd" _ $random (1000))
} elseif msg= "getBig" {
do .. send ( $replace ( $j ( "" ,32000), " " , "é" ))
} elseif msg= "toAll" {
do .. sendBroadcast ( "from Caché to All" )
} elseif $e (msg)= "^" {
do .. sendBroadcast ( $$$FormatText ( " : %1" , $$$quote ( $p (msg, "^" ,2))))
}
}
/// onclose.
Method onclose()
{
set ^tmp( $i (^tmp), "onclose" )= ""
}
}
Note: Do not forget to enable WebSocket in browsers in which they are disabled by default, for example in Opera.
SAMPLES>do ##class(net.WebSocketServer).Start("demo.Server")
Class demo.webclient Extends %ZEN.Component.page
{
/// If true, then attempt to refresh this page when its session timeout period has expired.
/// This will cause a login page to display if the current session has ended
/// and security is set to require login.
Parameter AUTOLOGOUT As BOOLEAN = 0 ;
/// Comma-separated list of additional JS include files for the page.
Parameter JSINCLUDES As STRING = "websocket/swfobject.js,websocket/web_socket.js" ;
XData Contents [ XMLNamespace = "www.intersystems.com/zen" ]
{
< page xmlns = "www.intersystems.com/zen" title = "" >
< vgroup labelPosition = "left" >
< label id = "lb" label = " :" />
< text id = "usr" label = ":" />
< button caption = "" onclick = "zenPage.start();" />
< button caption = " 1" label = "Hello123xcf789" onclick = "ws.send('Hello123xcf789');" />
< button caption = " 2" label = "toAll" onclick = "ws.send('toAll');" />
< button caption = " 3" label = "get" onclick = "ws.send('get');" />
< button caption = " 4" label = "getBig" onclick = "ws.send('getBig');" />
< button caption = "" onclick = "ws.close();" />
</ vgroup >
</ page >
}
ClientMethod start() [ Language = javascript ]
{
ws = new WebSocket( "ws://127.0.0.1:10081/asd s HTTP/1.1///" );
ws.onopen = function () {
zenSetProp( 'lb' , 'value' , 'open' );
ws.send( '^' + zenGetProp( 'usr' , 'value' ));
};
ws.onmessage = function (e) {
zenAlert( 'onmessage' , ' length=' ,e.data.length, ' data=' ,e.data);
};
ws.onclose = function () {
zenSetProp( 'lb' , 'value' , 'close' );
};
ws.onerror = function () {
zenAlert( 'onerror' );
};
}
/// This client event, if present, is fired when the page is loaded.
ClientMethod onloadHandler() [ Language = javascript ]
{
// Let the library know where WebSocketMain.swf is:
WEB_SOCKET_SWF_LOCATION = "websocket/WebSocketMain.swf" ;
WEB_SOCKET_DEBUG = false;
}
}
USER>zw ^tmp ^tmp=8 ^tmp(1,"onbeforeconnect")=$lb("/asd%20s%20HTTP/1.1///","127.0.0.1:10081","","hybi-10") ^tmp(2,"onconnect")="" ^tmp(3,"onmessage")="^sdsdf" ^tmp(4,"onmessage")="Hello123xcf789" ^tmp(5,"onmessage")="toAll" ^tmp(6,"onmessage")="get" ^tmp(7,"onmessage")="getBig" ^tmp(8,"onclose")=""
USER>zw ^tmp ^tmp=8 ^tmp(1,"onbeforeconnect")=$lb("/asd s HTTP/1.1///","127.0.0.1:10081","","hybi-10") ^tmp(2,"onconnect")="" ^tmp(3,"onmessage")="^dfg" ^tmp(4,"onmessage")="Hello123xcf789" ^tmp(5,"onmessage")="toAll" ^tmp(6,"onmessage")="get" ^tmp(7,"onmessage")="getBig" ^tmp(8,"onclose")=""
Note: Details on setting up SSL in Caché DBMS can be found in one of the previous articles in this blog.
SAMPLES>do ##class(net.WebSocketServer).Start("demo.Server",,"WebSocketSSL")
SAMPLES>do ##class(net.WebSocketServer).StartPolicy()
"ws: //127.0.0.1: 10081 ..."on
"wss: //127.0.0.1: 10081 ..."
Source: https://habr.com/ru/post/144311/
All Articles