#!/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就会退出
贴下打印的是哪两个字符