flask-websocket,手写可用版
from __future__ import print_function
import json
from gevent import monkey;monkey.patch_all()
from flask import Flask, request, jsonify
from werkzeug.debug import DebuggedApplication
from geventwebsocket import WebSocketServer, WebSocketApplication, Resource, websocket
flask_app = Flask(__name__)
flask_app.debug = True
ws_obj = {}
class ChatApplication(WebSocketApplication):
def on_open(self):
global ws_obj
client_addr = self.ws.environ.get("REMOTE_ADDR")
client_port = str(self.ws.environ.get("REMOTE_PORT"))
print(client_port)
ws_obj['jc_' + client_port] = self.ws.handler.active_client
print("One client connected!")
def on_message(self, message):
# {"message": "fff", "msg_type": "update_clients", "nickname": "jc"}
if message is None:
return
message = json.loads(message)
if message['msg_type'] == 'message':
self.broadcast(message)
elif message['msg_type'] == 'update_clients':
self.send_client_list(message)
def send_client_list(self, message):
self.ws.send(json.dumps({
'msg_type': 'update_clients',
'clients': [
getattr(client, 'nickname', 'anonymous')
for client in self.ws.handler.server.clients.values()
]
}))
def broadcast(self, message):
for client in self.ws.handler.server.clients.values():
client.ws.send(json.dumps({
'msg_type': 'message',
'nickname': message['nickname'],
'message': message['message']
}))
def on_close(self, reason):
global ws_obj
for i in list(ws_obj.keys()):
if ws_obj[i] == self.ws.handler.active_client:
del ws_obj[i]
# print(ws_obj)
print("Connection closed!")
@flask_app.route('/test')
def test():
return jsonify({"data":1})
@flask_app.route('/')
def index():
# {"message": "聪少这不牛逼吗123",
# "user_port": "57088"}
global ws_obj
req = request.json
_port = req['user_port']
_message = req['message']
for i in ws_obj:
if i == "jc_" + _port:
ws_obj[i].ws.send(json.dumps({
'msg_type': 'message',
'message': _message
}))
return {"res": "发送成功"}
if __name__ == '__main__':
WebSocketServer(
('0.0.0.0', 9900),
Resource([
('^/chat', ChatApplication),
('^/.*', DebuggedApplication(flask_app))
]),
debug=False
).serve_forever()
python防脱发技巧

浙公网安备 33010602011771号