websocket服务器python版.docx
- 文档编号:9275237
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:11
- 大小:16.71KB
websocket服务器python版.docx
《websocket服务器python版.docx》由会员分享,可在线阅读,更多相关《websocket服务器python版.docx(11页珍藏版)》请在冰豆网上搜索。
websocket服务器python版
websocket服务器(python版)
服务器
#coding=utf8
#!
/usr/bin/python
importstruct,socket
importhashlib
importthreading,random
importtime
importstruct
frombase64importb64encode,b64decode
connectionlist={}
g_code_length=0
g_header_length=0
defhex2dec(string_num):
returnstr(int(string_num.upper(),16))
defget_datalength(msg):
globalg_code_length
globalg_header_length
print(len(msg))
g_code_length=ord(msg[1])&127
received_length=0;
ifg_code_length==126:
#g_code_length=msg[2:
4]
#g_code_length=(ord(msg[2])<<8)+(ord(msg[3]))g_code_length=struct.unpack('>H',str(msg[2:
4]))[0]g_header_length=8
elifg_code_length==127:
#g_code_length=msg[2:
10]
g_code_length=struct.unpack('>Q',str(msg[2:
10]))[0]g_header_length=14
else:
g_header_length=6
g_code_length=int(g_code_length)
returng_code_length
defparse_data(msg):
globalg_code_length
g_code_length=ord(msg[1])&127
received_length=0;
ifg_code_length==126:
g_code_length=struct.unpack('>H',str(msg[2:
4]))[0]masks=msg[4:
8]
data=msg[8:
]
elifg_code_length==127:
g_code_length=struct.unpack('>Q',str(msg[2:
10]))[0]masks=msg[10:
14]
data=msg[14:
]
else:
masks=msg[2:
6]
data=msg[6:
]
i=0
raw_str=''
fordindata:
raw_str+=chr(ord(d)^ord(masks[i%4]))
i+=1
print(u"总长度是:
%d"%int(g_code_length))
returnraw_str
defsendMessage(message):
globalconnectionlist
message_utf_8=message.encode('utf-8')
forconnectioninconnectionlist.values():
back_str=[]
back_str.append('\x81')
data_length=len(message_utf_8)
ifdata_length<=125:
back_str.append(chr(data_length))
elifdata_length<=65535:
back_str.append(struct.pack('b',126))
back_str.append(struct.pack('>h',data_length))
#back_str.append(chr(data_length>>8))
#back_str.append(chr(data_length&0xFF))
#a=struct.pack('>h',data_length)
#b=chr(data_length>>8)
#c=chr(data_length&0xFF)
elifdata_length<=(2^64-1):
#back_str.append(chr(127))
back_str.append(struct.pack('b',127))
back_str.append(struct.pack('>q',data_length))
#back_str.append(chr(data_length>>8))
#back_str.append(chr(data_length&0xFF))
else:
print(u'太长了')
msg=''
forcinback_str:
msg+=c;
back_str=str(msg)+message_utf_8#.encode('utf-8')
#connection.send(str.encode(str(u"\x00%s\xFF\n\n"%message)))#这个是旧版
#print(u'sendmessage:
'+message)
ifback_str!
=Noneandlen(back_str)>0:
print(back_str)
connection.send(back_str)
defdeleteconnection(item):
globalconnectionlist
delconnectionlist['connection'+item]
classWebSocket(threading.Thread):
#继承Thread
GUID="258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
def__init__(self,conn,index,name,remote,path="/"):
threading.Thread.__init__(self)#初始化父类Threadself.conn=conn
self.index=index
self.name=name
self.remote=remote
self.path=path
self.buffer=""
self.buffer_utf8=""
self.length_buffer=0
defrun(self):
#重载Thread的run
print('Socket%sStart!
'%self.index)
headers={}
self.handshaken=False
whileTrue:
ifself.handshaken==False:
print('Socket%sStartHandshakenwith%s!
'%
(self.index,self.remote))
self.buffer+=bytes.decode(self.conn.recv(1024))
ifself.buffer.find('\r\n\r\n')!
=-1:
header,data=self.buffer.split('\r\n\r\n',1)
forlineinheader.split("\r\n")[1:
]:
key,value=line.split(":
",1)
headers[key]=value
headers["Location"]=("ws:
//%s%s"%(headers["Host"],self.path))key=headers['Sec-WebSocket-Key']
token=b64encode(hashlib.sha1(str.encode(str(key+
self.GUID))).digest())
handshake="HTTP/1.1101SwitchingProtocols\r\n"\
"Upgrade:
websocket\r\n"\
"Connection:
Upgrade\r\n"\
"Sec-WebSocket-Accept:
"+bytes.decode(token)+"\r\n"\
"WebSocket-Origin:
"+str(headers["Origin"])+"\r\n"\
"WebSocket-Location:
"+str(headers["Location"])+"\r\n\r\n"
self.conn.send(str.encode(str(handshake)))
self.handshaken=True
print('Socket%sHandshakenwith%ssuccess!
'%(self.index,self.remote))
sendMessage(u'Welcome,'+self.name+'!
')
self.buffer_utf8=""
g_code_length=0
else:
globalg_code_length
globalg_header_length
mm=self.conn.recv(128)
iflen(mm)<=0:
continue
ifg_code_length==0:
get_datalength(mm)
#接受的长度
self.length_buffer=self.length_buffer+len(mm)
self.buffer=self.buffer+mm
ifself.length_buffer-g_header_length continue else: self.buffer_utf8=parse_data(self.buffer)#utf8 msg_unicode=str(self.buffer_utf8).decode('utf-8','ignore')#unicode ifmsg_unicode=='quit': print(u'Socket%sLogout! '%(self.index)) nowTime= time.strftime('%H: %M: %S',time.localtime(time.time())) sendMessage(u'%s%ssay: %s'%(nowTime,self.remote,self.name+'Logout')) deleteconnection(str(self.index)) self.conn.close() break#退出线程 else: #print(u'Socket%sGotmsg: %sfrom%s! '%(self.index,msg_unicode,self.remote)) nowTime= time.strftime(u'%H: %M: %S',time.localtime(time.time())) sendMessage(u'%s%ssay: %s'%(nowTime,self.remote,msg_unicode)) #重置buffer和bufferlength self.buffer_utf8="" self.buffer="" g_code_length=0 self.length_buffer=0 self.buffer="" classWebSocketServer(object): def__init__(self): self.socket=None defbegin(self): print('WebSocketServerStart! ') self.socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)self.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)self.socket.bind(("127.0.0.1",12345)) self.socket.listen(50) globalconnectionlist whileTrue: connection,address=self.socket.accept() username=address[0] newSocket=WebSocket(connection,i,username,address)newSocket.start()#开始线程,执行run函数 connectionlist['connection'+str(i)]=connection i=i+1 if__name__=="__main__": server=WebSocketServer() server.begin() 客户端 测试了chrome37,firefox35 DOCTYPEhtml>
html,body{
font:
normal0.9emarial,helvetica;
#log{
width:
440px;
height:
200px;
border:
1pxsolid#7F9DB9;
overflow:
auto;
}
#msg{
width:
330px;
}
varsocket;
functioninit(){
varhost="ws:
//127.0.0.1:
12345/";
try{
socket=newWebSocket(host);
socket.onopen=function(msg){
log('Connected');
};
socket.onmessage=function(msg){log(msg.data);
};
socket.onclose=function(msg){
log("LoseConnection!
");
};
}
catch(ex){
log(ex);
}
$("msg").focus();
}
functionsend(){
vartxt,msg;
txt=$("msg");
msg=txt.value;
if(!
msg){
alert("Messagecannotbeempty");return;
}
txt.value="";
txt.focus();
try{
socket.send(msg);
}catch(ex){
log(ex);
}
}
window.onbeforeunload=function(){try{
socket.send('quit');
socket.close();
socket=null;
}
catch(ex){
log(ex);
}
};
function$(id){
returndocument.getElementById(id);
}
functionlog(msg){
$("log").innerHTML+="
"+msg;
}
functiononkey(event){
if(event.keyCode==13){
send();
}
}