diff --git a/ws_echo.py b/ws_echo.py index e5409d13..2405fcef 100755 --- a/ws_echo.py +++ b/ws_echo.py @@ -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 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 __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 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 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 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 " % 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) +