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()

posted @ 2021-12-01 11:37  河图s  阅读(42)  评论(0)    收藏  举报