]> git.proxmox.com Git - mirror_novnc.git/commitdiff
Simpler non-threaded ws_echo.py
authorJoel Martin <github@martintribe.org>
Wed, 31 Mar 2010 20:25:13 +0000 (15:25 -0500)
committerJoel Martin <github@martintribe.org>
Wed, 31 Mar 2010 20:25:13 +0000 (15:25 -0500)
ws_echo.py

index e5409d13d62004fdb34810d682b3cb54d46cb519..2405fcefd267e8f076dd38878a08388a24484931 100755 (executable)
@@ -1,8 +1,6 @@
 #!/usr/bin/python
-# File: asynchat-example-1.py
 
-import asyncore, asynchat
-import sys, os, socket, string
+import sys, os, socket
 
 server_handshake = """HTTP/1.1 101 Web Socket Protocol Handshake\r
 Upgrade: WebSocket\r
@@ -13,66 +11,45 @@ WebSocket-Protocol: sample\r
 \r
 """
 
-class WSChannel(asynchat.async_chat):
-
-    def __init__(self, server, sock, addr):
-        print ">> WSChannel.__init__"
-        asynchat.async_chat.__init__(self, sock)
-        self.set_terminator("\r\n\r\n")
-        self.handshake = None
-        self.data = ""
-        self.shutdown = 0
-
-    def collect_incoming_data(self, data):
-        #print ">> WSChannel.collect_incoming_data"
-        self.data = self.data + data
-
-    def found_terminator(self):
-        #print ">> WSChannel.found_terminator"
-        if not self.handshake:
-            # got the client handshake lines
-            self.handshake = self.data
-            req_lines = self.handshake.split("\r\n")
-            _, path, _ = req_lines[0].split(" ")
-            _, origin = req_lines[4].split(" ")
-            _, host = req_lines[3].split(" ")
-            print "*** got handshake:\n%s" % self.handshake
-            print "*** origin: %s, location: ws://%s%s" % (origin, host, path)
-            self.push(server_handshake % (origin, host, path))
-#            self.push("HTTP/1.1 101 Web Socket Protocol Handshake\r\n")
-#            self.push("Upgrade: WebSocket\r\n")
-#            self.push("Connection: Upgrade\r\n")
-#            self.push("WebSocket-Origin: %s\r\n" % origin)
-#            self.push("WebSocket-Location: ws://%s%s\r\n" % (host, path))
-#            self.push("WebSocket-Protocol: sample\r\n")
-#            self.push("\r\n")
-            self.set_terminator("\xff") # look for frame terminators
-        else:
-            # return payload.
-            print "received: %s" % self.data
-            self.push("\x00 client sent: %s \xff" % self.data)
-
-        self.data = ""
-
-class WSServer(asyncore.dispatcher):
-
-    def __init__(self, port):
-        asyncore.dispatcher.__init__(self)
-        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
-        self.bind(("", port))
-        self.listen(5)
-        print "<< WSServer.__init__"
-
-    def handle_accept(self):
-        print ">> WSServer.handle_accept"
-        conn, addr = self.accept()
-        WSChannel(self, conn, addr)
+def start_server(port):
+    tick = 0
+    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+    sock.bind(('', port))
+    sock.listen(100)
+    while True:
+        try:
+            print 'listening on port %s' % port 
+            csock, address = sock.accept()
+            tick+=1
+            print 'Got connection'
+            handshake(csock, tick)
+            print 'handshaken'
+            while True:
+                interact(csock, tick)
+                tick+=1
+        except Exception, e:
+            print "Ignoring exception:", e
+
+def handshake(client, tick):
+    handshake = client.recv(255)
+    req_lines = handshake.split("\r\n")
+    _, path, _ = req_lines[0].split(" ")
+    _, origin = req_lines[4].split(" ")
+    _, host = req_lines[3].split(" ")
+    print "*** got handshake:\n%s" % handshake
+    print "*** origin: %s, location: ws://%s%s" % (origin, host, path)
+    client.send(server_handshake % (origin, host, path))
+
+def interact(client, tick):
+    data = client.recv(255)
+    print 'got:%s' %(data)
+    client.send("\x00 server response %d \xff" % (tick))
 
 if __name__ == '__main__':
     if len(sys.argv) < 2:
         print "Usage: %s <port>" % sys.argv[0]
         sys.exit(2)
     PORT = int(sys.argv[1])
-    s = WSServer(PORT)
-    print "serving Web Socket at port", PORT, "..."
-    asyncore.loop()
+    start_server(PORT)
+