Next: , Previous: , Up: Usage Examples   [Contents][Index]


4.10 Web Socket

Example demonstrating the use of web sockets for full duplex communication between clients and the server. Handlers may use the ws-web-socket-connect function (see ws-web-socket-connect) to check for and respond to a web socket upgrade request sent by the client (as demonstrated with the new WebSocket JavaScript code in the example). Upon successfully initializing a web socket connection the call to ws-web-socket-connect will return the web socket network process. This process may then be used by the server to communicate with the client over the web socket using the process-send-string and ws-web-socket-frame functions. All web socket communication must be wrapped in frames using the ws-web-socket-frame function.

The handler must pass a function as the second argument to ws-web-socket-connect. This function will be called on every web socket message received from the client.

Note: in order to keep the web socket connection alive the request handler from which ws-web-socket-connect is called must return the :keep-alive keyword, as demonstrated in the example.

;;; web-sockets.el --- communicate via web-sockets

(lexical-let* ((web-socket-port 9009)
               (web-socket-page
                (format "<html>
<head>
<script type=\"text/javascript\">
var ws;
function connect(){
  ws = new WebSocket(\"ws://localhost:%d/\");

  ws.onopen    = function()    { alert(\"connected\"); };
  ws.onmessage = function(msg) { alert(\"server: \" + msg.data); };
  ws.onclose   = function()    { alert(\"connection closed\"); };
}

function message(){ ws.send(\"foo\"); }

function close(){ ws.close(); };
</script>
</head>
<body>
<ol>

<li>Press \"connect\" to initialize the web socket connection to
    the server.  The server will complete the web socket
    handshake at which point you'll see an alert with the text
    \"connected\".</li>

<li>Press \"message\" to send the string \"foo\" to the server.
    The server will reply with the text \"you said: foo\" which
    you will see in an alert as \"server: you said: foo\".</li>

<li>Press \"close\" to close the connection.  After the server
    responds with a close frame you will see an alert with the
    text \"connection closed\".</li>

</ol>
<a href=\"javascript:connect()\">connect</a>
<a href=\"javascript:message()\">message</a>
<a href=\"javascript:close()\">close</a>
</body>
</html>" web-socket-port)))
  (ws-start
   (lambda (request)
     (with-slots (process headers) request
       ;; if a web-socket request, then connect and keep open
       (if (ws-web-socket-connect request
             (lambda (proc string)
               (process-send-string proc
                 (ws-web-socket-frame (concat "you said: " string)))))
           (prog1 :keep-alive (setq my-connection process))
         ;; otherwise send the index page
         (ws-response-header process 200 '("Content-type" . "text/html"))
         (process-send-string process web-socket-page))))
   web-socket-port))

Next: , Previous: , Up: Usage Examples   [Contents][Index]