websocket scheme
Hi, here is my first web socket client implementation draft. First of all, it is very simple. I used this as an example: http://github.com/adamac/Java-WebSocket-client/blob/master/src/com/sixfire/websocket/WebSocket.java And I tested only with this simple websocket chat server: http://www.codeproject.com/KB/webservices/c_sharp_web_socket_server/WebSocketChatServer.zip run the chat server, it uses port 8181, so open that port on your firewall. start this script type; p: open url it should connect to the server and start the script again connect to the server. try 'insert p "hello"' from one client, on the other one, 'pick p 1' it should receive the message. currently no utf8 handling, no authentication support, no data packets handling. R E B O L [ title: "Web Socket Client Protocol Implementation" version: 0.0.1 date: 2010-07-17 author: "Semseddin (Endo) Moldibi" license: 'public-domain ] make root-protocol [ port-flags: system/standard/port-flags/pass-thru open: func [port /local client-request tmp] [ if port/port-id = 0 [port/port-id: 80] client-request: rejoin [ "HTTP/1.1 101 Web Socket Protocol Handshake" newline "Upgrade: WebSocket" newline "Connection: Upgrade" newline "WebSocket-Origin: " join http:// port/host newline "WebSocket-Location: " port/url newline ] port/locals: make object! [header: make string! 1024] port/state/tail: 2000 port/state/index: 0 port/state/flags: port/state/flags or port-flags ;open communication port & send web socket request open-proto/sub-protocol/generic port 'tcp system/words/insert port/sub-port client-request ;read result if not all [ equal? "HTTP/1.1 101 Web Socket Protocol Handshake" first port/sub-port equal? "Upgrade: WebSocket" first port/sub-port equal? "Connection: Upgrade" first port/sub-port ] [ print "Invalid handshake response." ] set-modes port [lines: false no-wait: true] ;read headers until [none? tmp: pick port 1] ] insert: func [port data] [ system/words/insert port/sub-port rejoin [#{00} data #{FF}] data ] ;pick: func [port /local data b e] [ pick: func [port] [ data: make string! 63 forever [ either error? try [ b: system/words/first port/sub-port ] [ data: none break ] [ if b > 0 [ if b = 255 [ break ] append data to-char b ] ] ] data ] close: func [port][ ;close the connection cleanly system/words/insert port/sub-port #{FF00} wait 0.2 system/words/close port/sub-port ] net-utils/net-install ws self 0 ] print "protocol loaded" url: ws://localhost:8181/chat ;p: open url halt
posted by: Endo 25-Jul-2010/17:06:32-7:00
here is the syntax highlighted version: http://www.moldibi.com/rebol/ws.html
posted by: Endo 26-Jul-2010/4:48:10-7:00
I've updated the ws script. Now you can get the header just after connected to server. PICK returns empty string instead of none when no new message. http://www.moldibi.com/rebol/ws.html >> p: open url >> print p/locals/header WebSocket-Origin: http://localhost:8080 WebSocket-Location: ws://localhost:8181/chat >> pick p 1 == "" ;returns empty string if no new message >> insert p "test" == "test" >> pick p 1 == "me: test" ;returns the message string comes from server
posted by: Endo 26-Jul-2010/17:47:48-7:00
Endo, I updated the rebolforum script to maintain your formatting :)
posted by: Nick 27-Jul-2010/0:58:29-7:00
|