flask + websocket实现简单的单聊和群聊


单聊

from flask import Flask,request,render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket
import json


app = Flask(__name__)

user_socket_dict = {}

@app.route('/ws/')
def ws(username):
    user_socket = request.environ.get('wsgi.websocket') # type:WebSocket
    user_socket_dict[username] = user_socket

    print(len(user_socket_dict),user_socket_dict)

    while 1:
        try:
            msg = user_socket.receive()
            msg = json.loads(msg)
            to_user = msg.get('to_user')
            content = msg.get('msg')
            usocket = user_socket_dict.get(to_user)
            recv_msg = {
                'from_user':username,
                'msg':content
            }

            usocket.send(json.dumps(recv_msg))
        except:
            pass

@app.route('/chat')
def chat():
    return render_template('chat.html')


if __name__ == '__main__':
    http_serv = WSGIServer(('0.0.0.0',5000),app,handler_class=WebSocketHandler)
    http_serv.serve_forever()
python代码

"en">

    "UTF-8">
    单聊


    "text" id="username">
    
    

给:"text" id="to_user">

发送消息:"text" id="msg">

"chat" style="width: 500px; height: 500px;">
页面

群聊

#!/usr/bin/env python
# -*- coding=utf-8 -*-
from flask import Flask,request,render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket
import json

app = Flask(__name__)

user_socket_list = []

@app.route('/ws')
def ws():
    user_socket = request.environ.get('wsgi.websocket') # type:WebSocket
    user_socket_list.append(user_socket)
    print(len(user_socket_list),user_socket_list)
    while 1:
        try:
            msg = user_socket.receive()
            for usocket in user_socket_list:
                if usocket != user_socket:
                    usocket.send(msg)
        except:
            user_socket_list.remove(user_socket)


@app.route('/chat')
def chat():
    return render_template('ws.html')

if __name__ == '__main__':
    http_serv = WSGIServer(('0.0.0.0',5000),app,handler_class=WebSocketHandler)
    http_serv.serve_forever()
Python代码

"en">

    "UTF-8">
    Title


发送消息:"text" id="msg">

"chat" style="width: 500px;height: 500px;">
页面