websocket 群聊,单聊,加密,解密
群聊
from flask import Flask, request, render_templatefrom geventwebsocket.handler import WebSocketHandlerfrom gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket
app = Flask(__name__) # type:Flask
user_socket_list = []
@app.route("/ws")def ws(): user_socket = request.environ.get("wsgi.websocket") # type:WebSocket if user_socket: user_socket_list.append(user_socket) print(len(user_socket_list), user_socket_list) while 1: msg = user_socket.receive() print(msg) for usocket in user_socket_list: if user_socket == usocket: continue try: usocket.send(msg) except: continue
@app.route("/")def index(): return render_template("ws.html")
if __name__ == '__main__': # app.run("0.0.0.0",5000,debug=True) http_serv = WSGIServer(("0.0.0.0", 5000), app, handler_class=WebSocketHandler) http_serv.serve_forever()**************************************************************************************************************************************************
<!DOCTYPE html><html lang="zh-CN"><head> <meta http-equiv="content-Type" charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title></head><body><p>发送内容:<input type="text" id="message"><button onclick="send_msg()">发送消息</button></p><div id="msg_list" style="width: 500px;">
</div></body><script type="application/javascript"> var ws = new WebSocket("ws://127.0.0.1:5000/ws"); // ws.onopen = function(){ // alert("欢迎来到S14群喷"); // }; ws.onmessage = function (ws_status) { console.log(ws_status.data); var ptag = document.createElement("p"); ptag.innerText = ws_status.data; document.getElementById("msg_list").appendChild(ptag); };
function send_msg() { var msg = document.getElementById("message").value; var ptag = document.createElement("p"); ptag.style.cssText = "text-align: right;"; ptag.innerText = msg; document.getElementById("msg_list").appendChild(ptag); ws.send(msg); }</script></html>
单聊
from flask import Flask, request, render_templatefrom geventwebsocket.handler import WebSocketHandlerfrom gevent.pywsgi import WSGIServerimport json
from geventwebsocket.websocket import WebSocket
app = Flask(__name__) # type:Flask
user_socket_dict = {}
@app.route("/ws/<user>")def ws(user): user_socket = request.environ.get("wsgi.websocket") # type:WebSocket if user_socket: user_socket_dict[user] = user_socket print(len(user_socket_dict), user_socket_dict) while 1: msg = user_socket.receive() print(msg) # b"{from_user:jinwangba ,to_user:yinwangba,msg:"doushidawangba"}" msg_dict = json.loads(msg) to_usocket = user_socket_dict.get(msg_dict.get("to_user")) to_usocket.send(json.dumps({"from_user": user, "to_user": msg_dict.get("to_user"), "msg": msg_dict.get("msg")}))
@app.route("/")def index(): return render_template("wsd.html")
if __name__ == '__main__': # app.run("0.0.0.0",5000,debug=True) http_serv = WSGIServer(("0.0.0.0", 5000), app, handler_class=WebSocketHandler) http_serv.serve_forever()
*********************************************************************************************************************************************************************************************
<!DOCTYPE html><html lang="zh-CN"><head> <meta http-equiv="content-Type" charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title></head><body><p>您的昵称:<input type="text" id="nick"><button onclick="openws()">进入聊天室</button></p><p>给<input type="text" id="to_user">发送:<input type="text" id="message"><button onclick="send_msg()">发送消息</button></p><div id="msg_list" style="width: 500px;">
</div></body><script type="application/javascript"> var ws = null; // ws.onopen = function(){ // alert("欢迎来到S14群喷"); // };
function openws(){ var nick = document.getElementById("nick").value; ws = new WebSocket("ws://127.0.0.1:5000/ws/"+nick); ws.onmessage = function (ws_status) { console.log(ws_status.data); var msg_obj = JSON.parse(ws_status.data); var ptag = document.createElement("p"); ptag.innerText = msg_obj.from_user + " : " +msg_obj.msg; document.getElementById("msg_list").appendChild(ptag); }; }
function send_msg() { var msg = document.getElementById("message").value; var from_user = document.getElementById("nick").value; var to_user = document.getElementById("to_user").value; var ptag = document.createElement("p"); ptag.style.cssText = "text-align: right;"; ptag.innerText = msg + " : "+ from_user; document.getElementById("msg_list").appendChild(ptag); var msg_obj = { msg:msg, from_user:from_user, to_user:to_user }; ws.send(JSON.stringify(msg_obj)); };
</script></html>
加密
加密:

1 import struct
2 msg_bytes = "hello".encode("utf8")
3 token = b"\x81"
4 length = len(msg_bytes)
5
6 if length < 126:
7 token += struct.pack("B", length)
8 elif length == 126:
9 token += struct.pack("!BH", 126, length)
10 else:
11 token += struct.pack("!BQ", 127, length)
12
13 msg = token + msg_bytes
14
15 print(msg)

解密
解密:

1 # b'\x81\x83\xceH\xb6\x85\xffz\x85'
2
3 hashstr = b'\x81\x83\xceH\xb6\x85\xffz\x85'
4 # b'\x81 \x83 \xceH\xb6\x85\xffz\x85'
5
6 # 将第二个字节也就是 \x83 第9-16位 进行与127进行位运算
7 payload = hashstr[1] & 127
8 print(payload)
9 if payload == 127:
10 extend_payload_len = hashstr[2:10]
11 mask = hashstr[10:14]
12 decoded = hashstr[14:]
13 # 当位运算结果等于127时,则第3-10个字节为数据长度
14 # 第11-14字节为mask 解密所需字符串
15 # 则数据为第15字节至结尾
16
17 if payload == 126:
18 extend_payload_len = hashstr[2:4]
19 mask = hashstr[4:8]
20 decoded = hashstr[8:]
21 # 当位运算结果等于126时,则第3-4个字节为数据长度
22 # 第5-8字节为mask 解密所需字符串
23 # 则数据为第9字节至结尾
24
25
26 if payload <= 125:
27 extend_payload_len = None
28 mask = hashstr[2:6]
29 decoded = hashstr[6:]
30
31 # 当位运算结果小于等于125时,则这个数字就是数据的长度
32 # 第3-6字节为mask 解密所需字符串
33 # 则数据为第7字节至结尾
34
35 str_byte = bytearray()
36
37 for i in range(len(decoded)):
38 byte = decoded[i] ^ mask[i % 4]
39 str_byte.append(byte)
40
41 print(str_byte.decode("utf8"))


1 # b'\x81\x83\xceH\xb6\x85\xffz\x85'
2
3 hashstr = b'\x81\x83\xceH\xb6\x85\xffz\x85'
4 # b'\x81 \x83 \xceH\xb6\x85\xffz\x85'
5
6 # 将第二个字节也就是 \x83 第9-16位 进行与127进行位运算
7 payload = hashstr[1] & 127
8 print(payload)
9 if payload == 127:
10 extend_payload_len = hashstr[2:10]
11 mask = hashstr[10:14]
12 decoded = hashstr[14:]
13 # 当位运算结果等于127时,则第3-10个字节为数据长度
14 # 第11-14字节为mask 解密所需字符串
15 # 则数据为第15字节至结尾
16
17 if payload == 126:
18 extend_payload_len = hashstr[2:4]
19 mask = hashstr[4:8]
20 decoded = hashstr[8:]
21 # 当位运算结果等于126时,则第3-4个字节为数据长度
22 # 第5-8字节为mask 解密所需字符串
23 # 则数据为第9字节至结尾
24
25
26 if payload <= 125:
27 extend_payload_len = None
28 mask = hashstr[2:6]
29 decoded = hashstr[6:]
30
31 # 当位运算结果小于等于125时,则这个数字就是数据的长度
32 # 第3-6字节为mask 解密所需字符串
33 # 则数据为第7字节至结尾
34
35 str_byte = bytearray()
36
37 for i in range(len(decoded)):
38 byte = decoded[i] ^ mask[i % 4]
39 str_byte.append(byte)
40
41 print(str_byte.decode("utf8"))

websocket 群聊,单聊,加密,解密的更多相关文章
- websocket 群聊单聊
websocket 介绍 介绍引自 https://segmentfault.com/a/1190000012709475 群聊 from flask import Flask, request, r ...
- Flask请求上下文源码讲解,简单的群聊单聊web
请求上下文流程图 群聊html代码 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- Flask-session,WTForms,POOL,Websocket通讯原理 -握手,加密解密过程
1.Flask-session Flask中的session 需要执行 session_interface - open_session存储到redis中,存的key:session:d3f07db2 ...
- websocket实现群聊和单聊(转)
昨日内容回顾 1.Flask路由 1.endpoint="user" # 反向url地址 2.url_address = url_for("user") 3.m ...
- flask 第五章 WebSocket GeventWebsocket 单聊群聊 握手 解密 加密
1.WebSocket 首先我们来回顾一下,我们之前用socket学习过的项目有: 1.django 2.flask 3.FTP - 文件服务 HTTP - TCP (特点): 1.一次请求,一次响应 ...
- websocket 实现单聊群聊 以及 握手原理+加密方式
WebSocket 开始代码 服务端 群聊 # type:WebSocket 给变量标注类型 # websocket web + socket from geventwebsocket.server ...
- 基于websocket的单聊.群聊
关于ai.baidu.com的 代码: #########################################核心代码################################### ...
- Websocket实现群聊、单聊
Websocket 使用的第三方模块:gevent-websocket 群聊 ws群聊.py中的内容 from flask import Flask, request, render_template ...
- WebSocket群聊与单聊
一 . WebSocket实现群聊 py文件代码 # py文件 from flask import Flask, render_template, request from geventwebsock ...
随机推荐
- i++和++i的笔试题
i = ++i + i++ + i++ + i++; 把每个 i++或者++i看作一个部分,他们的分别再下一个 i++或者++i改变,中途赋值的话,就返回这个部分的值 来自:https://www.j ...
- docker 运行java程序时区问题
如果 docker 上面 java 的当前时间比,真实时间慢了8 小时,那估计就是时区问题了, 需要在 打包docker镜像的时候 带上 localtime 和 timezone.(这2 个文件 ...
- 获取TypeError:__init __()缺少1个需要的位置参数:'on_delete'当试图添加父表后面的子表
解决办法:https://stackoverflow.com/questions/44026548/getting-typeerror-init-missing-1-required-position ...
- php 过滤器filter_var验证邮箱/url/ip等
验证邮箱.url或者ip,除了使用正则外,也可以使用内置的函数库过滤器filter来完成这些功能. filter_var (PHP 5 >= 5.2.0, PHP 7)filter_var — ...
- Appium Desktop Inspector 安卓真机配置(Windows)
本文是基于 Windows环境 通过Appium Desktop 测试真机,首先要确保测试机已经和电脑正确连接(将手机和电脑通过USB数据线连接,手机打开USB调试) 确认电脑与手机是否连接成功的方法 ...
- DelphiXE7 Datasnap TDSClientCallbackChannelManager内部实现初探
回调的原理很简单,开一个线程(为了区别其它线程,先将此线程命名为“通道线程”),注册一个“轻量”的回调,然后此线程(通道线程)等服务器返回信息(回调),服务器有信息返回时,通道线程再开个线程执行用户注 ...
- Linux tee命令详解
Linux tee命令 Linux tee命令用于读取标准输入的数据,并将其内容输出成文件.如果文件指定为"-",则将输入内容复制到标准输出 tee指令会从标准输入设备读取数据,将 ...
- 关于AXI_Quad_SPI的寄存器配置
关于AXI_Quad_SPI的寄存器配置 1.核初始化配置 首先是: 40:0000_000A 1C:8000_0000 28:0000_0004 2.命令与dummy_data 60:000001E ...
- DS二叉树--Huffman编码与解码
题目描述 1.问题描述 给定n个字符及其对应的权值,构造Huffman树,并进行huffman编码和译(解)码. 构造Huffman树时,要求左子树根的权值小于.等于右子树根的权值. 进行Huffma ...
- spring笔记-@Primary注解
1.问题 当一个接口有2个不同实现时,使用@Autowired注解时会报org.springframework.beans.factory.NoUniqueBeanDefinitionExceptio ...