#!/usr/bin/env python import socket import base64 import json import hashlib import struct from select import select class dryWebSocket(): ##### @staticmethod def handShake(serverHandle): key = '' data = serverHandle.recv(8192) for line in data.split('\r\n\r\n')[0].split('\r\n')[1:]: k, v = line.split(': ') if k == 'Sec-WebSocket-Key': key = base64.b64encode(hashlib.sha1(v + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11').digest()) response = 'HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept:%s\r\n\r\n' % key serverHandle.send(response) return True ##### @staticmethod def recv(serverHandle, size=1048576): data = serverHandle.recv(size) if not len(data): return False length = ord(data[1]) & 127 if length == 126: mask = data[4:8] raw = data[8:] elif length == 127: mask = data[10:14] raw = data[14:] else: mask = data[2:6] raw = data[6:] ret = '' for cnt, d in enumerate(raw): ret += chr(ord(d) ^ ord(mask[cnt%4])) return ret ##### @staticmethod def send(serverHandle, data): head = '\x81' if len(data) < 126: head += struct.pack('B', len(data)) elif len(data) <= 0xFFFF: head += struct.pack('!BH', 126, len(data)) else: head += struct.pack('!BQ', 127, len(data)) serverHandle.send(head + data) ########################################################################################## server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) socketList = set() ########## def run(ip, port, count, function, debug): server.bind((ip, port)) server.listen(count) socketList.add(server) print 'websocket server start on port %d' % port while True: r, w, e = select(socketList, [], []) for sock in r: if sock == server: serverHandle, addr = sock.accept() if dryWebSocket.handShake(serverHandle): socketList.add(serverHandle) else: data = dryWebSocket.recv(sock) if not data: socketList.remove(sock) else: if data!='\r': function(sock, data, debug) ########## def dataDo(serverHandle, data, debug): if debug: print data result={} try: jsonData=json.loads(data) result['status']='0' result['msg']='' result['data']={} result['data']['src']='https://www.baidu.com/img/bd_logo1.png' content=json.dumps(result) dryWebSocket.send(serverHandle, content) finally: print data ########## if __name__ == '__main__': run('0.0.0.0', 50001, 1, dataDo, True)
浏览器会连接这个websocket,浏览器第二次刷新连接就会出现这个字符,然后服务端的websocket就会退出
贴下打印的是哪两个字符