html5 websocket 新版协议聊天室 服务端(python版)
2012-05-17 16:27
751 查看
网上找了很多代码都是旧版协议的,研究了很久终于弄清楚了 现在发个用新版协议写的服务端代码出来(这个代码是从网上旧版协议改过来的)
最要就是握手协议和发送接受字符的方式变了
最要就是握手协议和发送接受字符的方式变了
# incoding=utf-8 import socket import struct import hashlib import threading,random import sys reload(sys) sys.setdefaultencoding('utf-8') connectionlist = {} def sendMessage(message): global connectionlist for connection in connectionlist.values(): print connection bstr = send_data(message) print bstr b = connection.send(bstr) def deleteconnection(item): global connectionlist del connectionlist['connection'+item] #接收客户端发送过来的消息,并且解包 def RecvData(nNum,client): try: pData = client.recv(nNum) if not len(pData): return False except: return False else: code_length = ord(pData[1]) & 127 if code_length == 126: masks = pData[4:8] data = pData[8:] elif code_length == 127: masks = pData[10:14] data = pData[14:] else: masks = pData[2:6] data = pData[6:] raw_str = "" i = 0 for d in data: raw_str += chr(ord(d) ^ ord(masks[i%4])) i += 1 return raw_str #打包发送数据给客户端 def SendData(pData,client): if(pData == False): return False else: pData = str(pData) token = "\x81" length = len(pData) if length < 126: token += struct.pack("B", length) elif length <= 0xFFFF: token += struct.pack("!BH", 126, length) else: token += struct.pack("!BQ", 127, length) pData = '%s%s' % (token,pData) client.send(pData) return True def send_data(raw_str): back_str = [] back_str.append('\x81') data_length = len(raw_str) if data_length < 125: back_str.append(chr(data_length)) else: back_str.append(chr(126)) back_str.append(chr(data_length >> 8)) back_str.append(chr(data_length & 0xFF)) back_str = "".join(back_str) + raw_str return back_str class WebSocket(threading.Thread): def __init__(self,conn,index,name,remote, path="/"): threading.Thread.__init__(self) self.conn = conn self.index = index self.name = name self.remote = remote self.path = path self.buffer = "" def run(self): print 'Socket%s Start!' % self.index headers = {} self.handshaken = False while True: if self.handshaken == False: print 'Socket%s Start Handshaken with %s!' % (self.index,self.remote) self.buffer += self.conn.recv(1024) if self.buffer.find('\r\n\r\n') != -1: header, data = self.buffer.split('\r\n\r\n', 1) for line in header.split("\r\n")[1:]: key, value = line.split(": ", 1) headers[key] = value print 'header:-->'+header headers["Location"] = "ws://%s%s" %(headers["Host"], self.path) self.buffer = data[8:] key = headers["Sec-WebSocket-Key"] token = self.generate_token(key) handshake = '\ HTTP/1.1 101 Web Socket Protocol Handshake\r\n\ Upgrade: webSocket\r\n\ Connection: Upgrade\r\n\ Sec-WebSocket-Accept:%s\r\n\ Sec-WebSocket-Origin: %s\r\n\ Sec-WebSocket-Location: %s\r\n\r\n\ ' %(token,headers['Origin'], headers['Location']) print handshake num = self.conn.send(handshake) print str(num) self.handshaken = True print 'Socket%s Handshaken with %s success!' % (self.index,self.remote) #self.conn.send('\x00'+'Welcome'+'\xFF'+'\n') bstr = send_data("Welcome") print bstr self.conn.send(bstr) #SendData('\x00'+'Welcome'+'\xFF',self.conn) #sendMessage('Welcome, '+self.name+' !') else: self.buffer = RecvData(8196,self.conn) if self.buffer: print 'rec:'+self.buffer if self.buffer: #s = self.buffer.split("\xFF")[0][1:] s = self.buffer if s=='quit': print 'Socket%s Logout!' % (self.index) sendMessage(self.name+' Logout') deleteconnection(str(self.index)) self.conn.close() break else: print 'Socket%s Got msg:%s from %s!' % (self.index,s,self.remote) sendMessage(self.name+':'+s) self.buffer = "" def generate_token(self, key): import base64 nkey=key+'258EAFA5-E914-47DA-95CA-C5AB0DC85B11' nkey=base64.b64encode(hashlib.sha1(nkey).digest()) return nkey class WebSocketServer(object): def __init__(self): self.socket = None def begin(self): print 'WebSocketServer Start!' self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.bind(("192.168.1.210",1234)) self.socket.listen(50) global connectionlist i=0 while True: connection, address = self.socket.accept() username=address[0] newSocket = WebSocket(connection,i,username,address) newSocket.start() connectionlist['connection'+str(i)]=connection i = i + 1 if __name__ == "__main__": server = WebSocketServer() server.begin()
相关文章推荐
- python 实现新版websocket协议 server
- websocket新版协议分析+python实现 - 小小的世界
- Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
- [转] websocket新版协议分析+python实现 & websocket 通信协议
- Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
- WebSocket+HTML5实现在线聊天室
- 基于HTML5和Tomcat WebSocketServlet的聊天室简单实现
- Golang 实现WebSocket服务端,客户端和html5调用
- 基于Html5 websocket和Python的在线聊天室
- Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
- HTML5 WebSocket(Client) + JavaWeb(Server)实现简单的聊天室功能
- 用Python写了个websocket即时聊天网页(含客户端、服务端代码)
- python+soket实现UDP协议的客户/服务端中文聊天程序
- python+soket实现 TCP 协议的客户/服务端中文(自动回复)聊天程序
- 基于HTML5和Tomcat WebSocketServlet的聊天室简单实现
- HTML5 WebSocket(Client) + JavaWeb(Server) 实现简单的聊天室功能
- HTML5-WebSocket实现聊天室
- 利用html5的websocket实现websocket聊天室
- Golang实现基于Websocket协议的H5聊天室
- HTML5 WebSocket做聊天室(服务器端基于Jetty8)