- 将websocket请求以 {name:socket} 存储到字典或mongodb,redis中;
- while True建立通信循环
- socket.receive()收消息
- socket.send()发消息
- json模块序列化返回的数据
- 服务端根据客户端消息判断聊天类型,并选择socket对象
- 客户端根据服务端的消息将信息展示在不同区域
from flask import Flask
from geventwebsocket.handler import WebSocketHandler
from geventwebsocket.server import WSGIServer
from flask import request
from geventwebsocket.websocket import WebSocket # 语法提示
from flask import render_template
from json import loads, dumps
app = Flask(__name__, template_folder='./templates')
socket_dic = {
}
@app.route('/ws/')
def ws(username):
sock = request.environ.get('wsgi.websocket', None) # type:WebSocket
# 不是ws协议上来的协议取不到wsgi.websocket
if not sock:
return '请使用ws链接'
socket_dic[username] = sock
print(socket_dic)
while True:
msg = sock.receive()
if msg:
msg_dic = loads(msg)
to = msg_dic.get('to')
data = msg_dic.get('data')
host = msg_dic.get('host')
if to:
if to in socket_dic.keys():
socket_dic[to].send(dumps({'host': host, 'data': data, 'to': to}))
sock.send(dumps({'host': host, 'data': data, 'to': to}))
else:
continue
else:
for v in socket_dic.values():
v.send(dumps({'host': host, 'data': data, 'to': to}))
@app.route('/')
def login():
return render_template('client.html')
if __name__ == '__main__':
http_server = WSGIServer(('127.0.0.1', 5000), app, handler_class=WebSocketHandler)
http_server.serve_forever()
html
client
{# 登录模块 #}
欢迎登录九聊!
username:
{# 聊天信息显示模块 #}
效果演示



