博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python从socket做个websocket的聊天室server
阅读量:4307 次
发布时间:2019-06-06

本文共 3790 字,大约阅读时间需要 12 分钟。

下面的是server端:把IP改成自己的局域网IP:

  

#coding:utf8import socket,selectimport SocketServerimport hashlib,base64,timefrom pprint import pprint#author:lijimdef f(key):                s=key+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"        sha1=hashlib.sha1(s)        dig=sha1.digest()        return base64.encodestring(dig).strip()def parse_data(msg):    code_length = ord(msg[1]) & 127     if code_length == 126:        masks = msg[4:8]        data = msg[8:]    elif code_length == 127:        masks = msg[10:14]        data = msg[14:]    else:        masks = msg[2:6]        data = msg[6:]     i = 0    raw_str = ''     for d in data:        raw_str += chr(ord(d) ^ ord(masks[i%4]))        i += 1    return raw_strdef 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_strgmsg=Nonedef m(cs,raddr):        print raddr        req= cs.recv(8*1024)        print 'request:\n',req        print '-'*20+'\n'                        tmplist=req.split("\r\n")        headers={}        get=tmplist.pop(0)        for i in tmplist:                if i.find(":") !=-1:                                                item=i.split(":")                                                headers[item[0]]=item[1].strip()    #    pprint(headers)        key=headers.get("Sec-WebSocket-Key","")        print '-'*20        print 'key:',key        accept=f(key)        print '-'*20+'\n'        ends=websocktemplate%(accept,headers.get("Sec-WebSocket-Origin","NULL").strip(),headers.get("Host","").strip(),)                print 'response:\n'        print ends        cs.send(ends)        print '-'*20        global gmsg        while 1:                try:                    r,w,e=select.select([cs,],[],[],0.5)                    if gmsg:                            cs.send(send_data(str(raddr)+':'+gmsg))                            gmsg=None                    if cs in r:                            msg=cs.recv(8*1024)                            if msg:                                    data=parse_data(msg)                                                                        if data!='close':                                            gmsg=data                                            print '%s:%s'%(raddr,data)                                            cs.send(send_data(str(raddr)+':'+data))                                    else:                                            break                                                        except:                        cs.close()                            ##        cs.shutdown(2)##        cs.close()##        except KeyboardInterrupt:###            sock.shutdown(1)##            sock.close()##            print 'stop.'##            break sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)address=("192.168.1.104",8888)sock.bind(address)sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)sock.listen(20)websocktemplate=''.join(["HTTP/1.1 101 Switching Protocols\r\n","content-type:charset=utf-8\r\n","Upgrade:websocket\r\n","Connection: Upgrade\r\n","Sec-WebSocket-Accept:%s\r\n","WebSocket-Origin:%s\r\n","WebSocket-Location: ws://%s/WebManagerSocket\r\n","WebSocket-Protocol:WebManagerSocket\r\n\r\n"])import threadingwhile 1:    r,w,e=select.select([sock,],[],[],1)    print 'wait..'    if sock in r:            cs,raddr=sock.accept()            t=threading.Thread(target=m,args=(cs,raddr))            t.setDaemon(1)            t.start()

下面为html页面:

WebSocket

WebSocket

  

 

 

转载于:https://www.cnblogs.com/Yeah-come-on/p/3593506.html

你可能感兴趣的文章
通向财务自由之路01_导读
查看>>
通向财务自由之路02_成功的决定因素:你
查看>>
中低频量化交易策略研发01_引言
查看>>
中低频量化交易策略研发06_推进的择时策略
查看>>
史丹·温斯坦称傲牛熊市的秘密
查看>>
期货市场技术分析01_理论基础
查看>>
期货市场技术分析02_趋势的基本概念
查看>>
期货市场技术分析03_主要反转形态
查看>>
期货市场技术分析04_持续形态
查看>>
期货市场技术分析05_交易量和持仓兴趣
查看>>
TB交易开拓者入门教程
查看>>
TB创建公式应用dll失败 请检查用户权限,终极解决方案
查看>>
python绘制k线图(蜡烛图)报错 No module named 'matplotlib.finance
查看>>
talib均线大全
查看>>
期货市场技术分析06_长期图表和商品指数
查看>>
期货市场技术分析07_摆动指数和相反意见理论
查看>>
满屏的指标?删了吧,手把手教你裸 K 交易!
查看>>
不吹不黑 | 聊聊为什么要用99%精度的数据回测
查看>>
对于模拟交易所引发的思考
查看>>
高频交易的几种策略
查看>>