博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网上测试了很多关于PYTHON的WEBSOCKET样例,下面这个才成功了
阅读量:5234 次
发布时间:2019-06-14

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

这是最底层的,

嘿嘿,我 还是习惯搞个框架来实现急需要的功能。。。

这个东东玩得很有意思的。。

服务器端的代码:

import simplejsonimport socketimport sysimport base64import hashlibimport timeHOST = '127.0.0.1'PORT = 9000MAGIC_STRING = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'HANDSHAKE_STRING = "HTTP/1.1 101 Switching Protocols\r\n" \    "Upgrade:WebSocket\r\n" \    "Connection: Upgrade\r\n" \    "Sec-WebSocket-Accept: {1}\r\n" \    "WebSocket-Location: ws://{2}/chat\r\n" \    "WebSocket-Protocol:chat\r\n\r\n"def parse_data(msg):    v = ord(msg[1]) & 0x7f    if v == 0x7e:        p = 4    elif v == 0x7f:        p = 10    else:        p = 2    mask = msg[p:p+4]    data = msg[p+4:]    return ''.join([chr(ord(v) ^ ord(mask[k%4])) for k, v in enumerate(data)])def start():    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)    try:        sock.bind((HOST, PORT))        sock.listen(100)    except Exception as e:        print('bind error')        print(e)        sys.exit()    while True:        conn, add = sock.accept()        try:            handshake(conn)        finally:            print('finally')            conn.close()    sock.close()    passdef handshake(conn):    headers = {}    shake = conn.recv(1024)    print shake    if not len(shake):        print('len error')        return False    header, data = shake.split('\r\n\r\n', 1)    for line in header.split('\r\n')[1:]:        key, value = line.split(': ', 1)        headers[key] = value    if 'Sec-WebSocket-Key' not in headers:        print('this is not websocket, client close.')        print headers        conn.close()        return False    sec_key = headers['Sec-WebSocket-Key']    res_key = base64.b64encode(hashlib.sha1(sec_key + MAGIC_STRING).digest())    str_handshke = HANDSHAKE_STRING.replace('{1}', res_key).replace('{2}', HOST + ":" + str(PORT))    print str_handshke    conn.send(str_handshke)    time.sleep(1)    conn.send('%c%c%s' % (0x81, 6, 'suren1'))    msg = conn.recv(1024)    msg = parse_data(msg)    print('msg : ' + msg)    time.sleep(1)    conn.send('%c%c%s' % (0x81, 6, 'suren2'))    msg = conn.recv(1024)    msg = parse_data(msg)    print('msg : ' + msg)    time.sleep(1)    conn.send('%c%c%s' % (0x81, 6, 'suren3'))    msg = conn.recv(1024)    msg = parse_data(msg)    print('msg : ' + msg)    return True    passif __name__ == '__main__':    try:        start()    except Exception as e:        print(e)

 

浏览器端的代码:

  

 

效果图:

今天学习完工,应该是家庭,电影,小说的时间啦啦。。。

 

转载于:https://www.cnblogs.com/aguncn/p/5059337.html

你可能感兴趣的文章
novalidate
查看>>
label for标签的作用
查看>>
uml多重性
查看>>
fastjson @JsonField
查看>>
jvm配置
查看>>
重载类型运算符
查看>>
EasyUI学习-如何使用jQuery EasyUI?
查看>>
前端JS之HTML利用XMLHttpRequest()和FormData()进行大文件分段上传
查看>>
jQuery获取Select选择的Text和 Value
查看>>
hdu1525 Euclid's Game , 基础博弈
查看>>
UVA 1262 Password 暴力枚举
查看>>
CakePHP不支持path/to路径,前后台无法方法
查看>>
「分享」jquery标签(关键字)插件
查看>>
RHEL7网卡命名规则
查看>>
ALV式的弹出窗口
查看>>
第六课 移动工具
查看>>
opensns学习
查看>>
第7次作业 选题报告和需求分析
查看>>
创建元素节点
查看>>
Sencha+cordova 构造 华丽手机程序,并讲讲,在商用项目中经常用到的cordova插件(一)...
查看>>