Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Here is a working example of a WebSocket client/server (client in Javascript, server in Python 2.6)</p> <p>It used examples from various places (including kanaka's answer/noVNC, and <a href="http://blog.new-bamboo.co.uk/2010/6/7/living-on-the-edge-of-the-websocket-protocol" rel="nofollow">this page</a> and <a href="http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/" rel="nofollow">this page</a>)</p> <p>Works with Chrome 10.0.648.127, Safari 5.0.3 and MobileSafari on iPad from iOS 4.3</p> <p>It's by no means well written code (the example HTML page is especially terrible) - use at your own risk and so on..</p> <pre><code>#!/usr/bin/env python import socket import threading import struct import hashlib PORT = 9876 def create_handshake_resp(handshake): final_line = "" lines = handshake.splitlines() for line in lines: parts = line.partition(": ") if parts[0] == "Sec-WebSocket-Key1": key1 = parts[2] elif parts[0] == "Sec-WebSocket-Key2": key2 = parts[2] elif parts[0] == "Host": host = parts[2] elif parts[0] == "Origin": origin = parts[2] final_line = line spaces1 = key1.count(" ") spaces2 = key2.count(" ") num1 = int("".join([c for c in key1 if c.isdigit()])) / spaces1 num2 = int("".join([c for c in key2 if c.isdigit()])) / spaces2 token = hashlib.md5(struct.pack('&gt;II8s', num1, num2, final_line)).digest() return ( "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" "Upgrade: WebSocket\r\n" "Connection: Upgrade\r\n" "Sec-WebSocket-Origin: %s\r\n" "Sec-WebSocket-Location: ws://%s/\r\n" "\r\n" "%s") % ( origin, host, token) def handle(s, addr): data = s.recv(1024) s.send(create_handshake_resp(data)) lock = threading.Lock() while 1: print "Waiting for data from", s, addr data = s.recv(1024) print "Done" if not data: print "No data" break print 'Data from', addr, ':', data # Broadcast received data to all clients lock.acquire() [conn.send(data) for conn in clients] lock.release() print 'Client closed:', addr lock.acquire() clients.remove(s) lock.release() s.close() def start_server(): s = socket.socket() s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('', PORT)) s.listen(1) while 1: conn, addr = s.accept() print 'Connected by', addr clients.append(conn) threading.Thread(target = handle, args = (conn, addr)).start() clients = [] start_server() </code></pre> <p>Also, a crappy example HTML page to show it working:</p> <pre><code>&lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;title&gt;Test&lt;/title&gt; &lt;script type="application/javascript"&gt; var ws; function init() { var servermsg = document.getElementById("servermsg"); ws = new WebSocket("ws://localhost:9876/"); ws.onopen = function(){ servermsg.innerHTML = servermsg.innerHTML + "&lt;br&gt;Server connected"; servermsg.innerHTML = servermsg.innerHTML + "&lt;br&gt;Sending message to server"; ws.send("Hello Mr. Server!"); }; ws.onmessage = function(e){ servermsg.innerHTML = servermsg.innerHTML + "&lt;br&gt;Recieved data: " + e.data; }; ws.onclose = function(){ console.log("Server disconnected"); servermsg.innerHTML = servermsg.innerHTML + "&lt;br&gt;Connected"; }; } function postmsg(){ var text = document.getElementById("message").value; ws.send(text); servermsg.innerHTML = servermsg.innerHTML + "&lt;br&gt;Sent: " + text; return false; } &lt;/script&gt; &lt;/head&gt; &lt;body onload="init();"&gt; &lt;form action="" onSubmit="postmsg()"&gt; &lt;input type="text" name="message" value="" id="message"&gt; &lt;input type="submit" name="submit" value="" id="submit"&gt; &lt;/form&gt; &lt;div id="servermsg"&gt;&lt;h1&gt;Message log:&lt;/h1&gt;&lt;/div&gt; &lt;/body&gt; &lt;/html&gt; </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload