# A、B client:无限循环和服务器对话,有 xx 消息吗?
# A、B client:client 发起请求至 server,等待15s(默认http超时时间) --> 等待消息时间
# -->主动断开连接
# -->收到消息主动返回
# 下载 gevent-websocket,Websocket
# 请求处理 WSGI 处理 HTTP 请求,WebSocketHandler处理socket请求
# 使用 WSGIServer 替换flask的 Werkzueg
# 语法提示
from flask import Flask
from geventwebsocket.hander import WebSocketHandler
from geventwebsocket.server import WSGIServer
from geventwebsocket.websocket import WebSocket
app = Flask(__name__)
@app.route('/ws')
def ichat():
print(request.environ)
ws_socket = request.environ.get('wsgi.websocket') # type:WebSocket
try:
while True:
msg = ws_socket.receive()
print(msg)
ws_socket.send(b'xxx')
except:pass
# return '200 ok!'
if __name__ == '__main__':
# handler_class=WSGIhandler(not sure),只支持http请求
http_server = WSGIServer(('0.0.0.0', 9527), app, handler_class=WebSocketHandler)
http_server.server_forever()
<script type='application/javascript'>
var ws = new WebSocket('ws://127.0.0.1:5000/chat');
ws.onmessage = function (messageEvent) {
console.log(messageEvent.data);
var ptag = document.createElement('p');
ptag.innerText = messageEvent.data;
document.getElementById('content_list').appendChild(ptag);
};
function send_message() {
var msg = document.getElementById('content').value;
ws.send(msg);
}
</script>
// ws.close
socket_list = []
@app.route('/chat/<username>')
def chat(username):
# print(request.environ)
websocket_obj = request.environ.get('wsgi.websocket') # type:WebSocket
websocket_dict[username] = websocket_obj
while True:
msg = websocket_obj.receive()
msg_dict = json.loads(msg)
receiver = msg_dict.get('receiver')
try:
receiver_socket = websocket_dict.get(receiver)
receiver_socket.send(msg)
except:
msg = {'sender': '系统',
'receiver': username,
'data':'对方不在线',
}
websocket_obj.send(json.dumps(msg))
@app.route('/ws')
def ws():
return render_template('ptop.html')
<script type="application/javascript">
var ws;
function send_message() {
var msg = {
sender:document.getElementById('username').value,
receiver:document.getElementById('receiver').value,
data:document.getElementById('content').value,
};
var data = JSON.stringify(msg);
ws.send(data);
var ptag = document.createElement('p');
ptag.innerText = msg.data + ':' + msg.sender;
ptag.style.cssText = "text-align:right";
document.getElementById('content_list').appendChild(ptag);
}
function login() {
var username = document.getElementById('username').value;
ws = new WebSocket('ws://127.0.0.1:5000/chat/' + username);
ws.onmessage = function (messageEvent) {
// 收到信息后先反序列化,在创建 p 标签并加入到div中
var msg = JSON.parse(messageEvent.data);
var ptag = document.createElement('p');
ptag.innerText = msg.sender + ':' + msg.data;
document.getElementById('content_list').appendChild(ptag);
};
}
</script>
var ws = new WebSocket('ws://ip:port/路径')
// ws.onmessage 当ws客户端收到消息时执行回调函数
// ws.onopen 当ws客户端建立完成连接时, status == 1 时执行
// ws.onclose 当ws客户端关闭中后关闭,执行的回调函数,status 2 或 3
// ws.onerror 当ws客户端出现错误时
ws.onmessage = func(messageEvent){
...
}
import json
from flask import Flask, request
from geventwebsocket.handler import WebSocketHandler
from geventwebsocket.server import WSGIServer
from geventwebsocket.websocket import WebSocket
ws = Flask(__name__)
web_socket = {}
@ws.route('/app/<user_id>')
def app(user_id):
app_socket = request.environ.get('wsgi.websocket') # type:WebSocket
web_socket[user_id] = app_socket
print('建立app_socket连接。。。', app_socket, user_id)
while True:
try:
# 收发数据
msg = app_socket.receive()
msg_info = json.loads(msg)
receiver = msg_info.get('to_user')
receiver_socket = web_socket.get(receiver)
try:
receiver_socket.send(msg)
except:
web_socket.pop(receiver)
except:
pass
@ws.route('/toy/<toy_id>')
def toy(toy_id):
toy_socket = request.environ.get('wsgi.websocket') # type:WebSocket
web_socket[toy_id] = toy_socket
print('保持toy_socket连接。。。', toy_socket, toy_id)
while True:
try:
msg = toy_socket.receive()
msg_info = json.loads(msg)
receiver = msg_info.get('to_user')
receiver_socket = web_socket.get(receiver)
receiver_socket.send(msg)
except:
pass
if __name__ == '__main__':
http_server = WSGIServer(('0.0.0.0', 9528), ws, handler_class=WebSocketHandler)
http_server.serve_forever()
原文:https://www.cnblogs.com/henryw/p/11574622.html