World: r3wp
[!Cheyenne] Discussions about the Cheyenne Web Server
older newer | first last |
Graham 25-Dec-2009 [6722] | code.google.com |
Terry 25-Dec-2009 [6723x4] | yeah, just found it |
Doc, I'm not sure RSP is the proper handler for websockets. The earlier stuff i was working on used a forever loop. Isn't RSP more traditional stateless? | |
working fine here Graham | |
I'm not even sure that such server can be built in a efficient way with REBOL without multi-threading support (can't share port! values between processes). This is where i hit the wall in the past. (Look back in this group to Nov 8th and prior posts) Isn't "just passing messages between sockets" enough? What else did you have in mind? My thought would be a business layer managing sockets? no? Anyway.. nice work. I told you it would only take a couple of hours for a guru :) | |
Dockimbel 25-Dec-2009 [6727] | Graham: you should check if your server is reachable on this URL : http://localhost/ws.rsp(it should if you're using the config file from SVN). Web Control Panel : yes, it's easier with web sockets than with COMET approach, but it's not a show stopper anyway. Mail server : it could make it easier if you're using a client supporting web sockets. |
Terry 25-Dec-2009 [6728] | Can i put a forever loop in RSP, and how would i push the buffer? |
Dockimbel 25-Dec-2009 [6729] | No you can't, it won't work (RSP engine use a request/response model), but even if you could, that would mean one process per client connection, definitely not scalable. |
Terry 25-Dec-2009 [6730] | Strikes me as a new Uniserve service |
Dockimbel 25-Dec-2009 [6731] | My thought would be a business layer managing sockets? If you want a kind of bridging server (web sockets<=> Server <=> TCP), there's already existing products doing that like http://www.kaazing.com/products/kaazing-websocket-gateway |
Terry 25-Dec-2009 [6732x6] | Well, there's already existing web servers as well. .That's not the point. |
This could be a Kaazing killer | |
(Watch that pop to the top of Google when searching 'Kaazing' :) | |
Needs to be in a forever loop somewhere. I'm guessing a service (or protocol.. can't remember which) so that you can connect and to this.. forever [ do %somehandler.r ] where somehandler.r could manage the connections? no? | |
so the "polling" aspect is moved from the client -> server.. to an internal script via multiple forevers or sumtin' like that ? | |
something like taskmaster? | |
Dockimbel 25-Dec-2009 [6738] | I don't get your "forever loop" approach, UniServe uses an event loop. |
Terry 25-Dec-2009 [6739x6] | I'm looking for some old experiments |
but wouldn't it just be standard on-connected , on-received protocol handlers anyway? | |
it requires some kind of null event at the end of each incoming message | |
install-service [ name: 'test port-id: 3001 stop-at: "^@" | |
(that's the standard Flash EOF) | |
on-received: func [data][ theIP: client/remote-ip do %websockethandler.r ] | |
Dockimbel 25-Dec-2009 [6745] | If you're trying to ask if a gateway like Kazaaing can be built using UniServe, the answer is : sure and it will be scalable. |
Terry 25-Dec-2009 [6746x3] | I think the hard part is done already.. dealing with ws:// |
(maybe wss:// might be a little trickier :) | |
It's exciting.. i'm sending javascript back to the browser via the websocket to be eval'd.. the browser just became a killer GUI | |
Dockimbel 25-Dec-2009 [6749x2] | Important notice wrt web sockets : IIRC, all data sent on both sides have to be UTF-8 encoded. The current Cheyenne implementation doesn't enforce that encoding, so it's up to the developer to send the right data format. |
This is apply to the so-called "text frames" which Cheyenne supports. The other kind of frames (binary frames) doesn't require such encoding (not supported by Cheyenne yet). | |
Terry 25-Dec-2009 [6751] | UTF-8 support is icing on the cake. |
Dockimbel 25-Dec-2009 [6752] | This is apply => This applies |
Terry 25-Dec-2009 [6753x3] | Here's quick demo of pushing javascript back for eval ---------WS.html-------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Welcome!</title> <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'</script> <script src='http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js'</script> </head> <body> <center> <h2>Web Socket test page</h2> <script> var conn = new WebSocket("ws://localhost/ws.rsp") conn.onopen = function(evt) { alert("Conn opened"); } conn.onmessage = function(evt) { eval(evt.data); } conn.onclose = function(evt) { alert("Conn closed"); } </script> <button onClick="conn.send('Hello World');"> Send Message </button> <button onclick="conn.send('makedrag');"> Make it drag</button> </center> <div id="test" style="height:100px;width:100px;border: 1px solid grey">MAKE ME DRAGGABLE</div> </body> </html> -------WS.rsp------ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Welcome!</title> <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'</script> <script src='http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js'</script> </head> <body> <center> <h2>Web Socket test page</h2> <script> var conn = new WebSocket("ws://localhost/ws.rsp") conn.onopen = function(evt) { alert("Conn opened"); } conn.onmessage = function(evt) { eval(evt.data); } conn.onclose = function(evt) { alert("Conn closed"); } </script> <button onClick="conn.send('Hello World');"> Send Message </button> <button onclick="conn.send('makedrag');"> Make it drag</button> </center> <div id="test" style="height:100px;width:100px;border: 1px solid grey">MAKE ME DRAGGABLE</div> </body> </html> |
oops | |
WS.rsp should look like this <% ;-- RSP API web sockets specific changes -- ; ; request/web-socket? => true if this is an incoming socket message, false if it's HTTP. ; request/content/data => contains the socket message (string!) ;-- just echo back the message //prin request/content/data inc: request/content/data if inc = "makedrag" [prin "$('#test').draggable();"] if inc = "Hello World" [prin "alert('Hello back');"] %> | |
Dockimbel 25-Dec-2009 [6756x2] | Btw, the Internet Draft defining the web socket protocol (http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-54) is really badly written. In particular, algorithm descriptions are incredibly obfuscated. On the design side, a packet-oriented protocol not sending packet length (for text frames), rather relying on begin/end markers, is a surprizing choice to me. |
Terry: I'm glad you're enjoying your christmas gift. ;-) | |
Terry 25-Dec-2009 [6758x2] | yeah.. you've ruined my whole day :) |
is there a particular code snippet repository everyone is using? | |
Dockimbel 25-Dec-2009 [6760] | I guess that can use a Cheyenne powered service for that : http://www.qwikitxt.com If it doesn't suit your needs, there's http://pastebin.com/ |
Terry 25-Dec-2009 [6761] | Hey.. i like the "eat your own dogfood" philosophy |
Graham 25-Dec-2009 [6762x3] | Not using the default config .. but I get this 26/12-10:17:23.838-[RSP] ##RSP Script Error: URL = /ws.rsp File = www/ws.rsp ** Script Error : Invalid path value: data ** Where: rsp-script ** Near: [prin request/content/data] Request = make object! [ headers: [Host "localhost:8000" Connection "keep-alive" User-Agent {Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.43 Safari/532.5} Accept {application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5} Accept-Encoding "gzip,deflate" Accept-Language "en-GB,en-US;q=0.8,en;q=0.6" Accept-Charset "ISO-8859-1,utf-8;q=0.7,*;q=0.3"] status-line: #{474554202F77732E72737020485454502F312E310D0A} method: 'GET url: "/ws.rsp" content: none path: "/" target: "ws.rsp" arg: none ext: '.rsp version: none file: %www/ws.rsp script-name: none ws?: none ] |
listening on port 8000 | |
I'll download a fresh svn .. | |
Terry 25-Dec-2009 [6765] | The only problem with eating your own dog food is sometimes it just doesn't taste that good.. like when it processes html Here's the pastebin code for the eval demo above http://pastebin.com/d1cfec7dc |
Graham 25-Dec-2009 [6766] | Very odd .. downloaded fresh checkout. There's no listen in the httpd.cfg but it starts up listening at 8000 and not 80. |
Pekr 25-Dec-2009 [6767] | I think it might be somewhere in Uniserve's config ... |
Graham 25-Dec-2009 [6768] | And if i browse to http://localhost:8000/ws.html .. I see the web socket test page, and I get a Chrome alert saying that Conn closed. |
Dockimbel 25-Dec-2009 [6769] | Graham: how do you start Cheyenne? |
Graham 25-Dec-2009 [6770x2] | I don't think we can listen at 80 anyway on Windows 7 |
do %cheyenne.r | |
older newer | first last |