向所有连接的客户端广播,除了使用python flask socketio的发件人

时间:2015-03-25 21:11:00

标签: python flask socket.io

我正在关注Alex Hadik的Flask Socketio教程,该教程构建了一个非常简单的烧瓶聊天应用程序。

http://www.alexhadik.com/blog/2015/1/29/using-socketio-with-python-and-flask-on-heroku

我想向除发件人之外的所有连接用户广播消息。我已经浏览了flasksocketio init .py,但我仍然不知道该怎么做。

这是服务器代码。

from flask import Flask, render_template,request
from flask.ext.socketio import SocketIO,emit,send
import json,sys

app = Flask(__name__)
socketio = SocketIO(app)
clients = {}
@app.route("/")
def index():
    return render_template('index.html',)

@socketio.on('send_message')
def handle_source(json_data):
    text = json_data['message'].encode('ascii', 'ignore')
    current_client = request.namespace
    current_client_id = request.namespace.socket.sessid
    update_client_list(current_client,current_client_id)
    if clients.keys():
        for client in clients.keys():
            if not current_client_id in client:
                clients[client].socketio.emit('echo', {'echo': 'Server Says: '+text})       

def update_client_list(current_client,current_client_id):
    if not current_client_id in clients: clients[current_client_id] = current_client
    return 

if __name__ == "__main__":
    socketio.run(app,debug = False)

目前只向所有连接的客户广播。我创建了一个连接客户端dict(客户端),它存储由客户端ID索引的request.namespace。 为发送客户端以外的所有客户端调用客户端[client] .socketio.emit()仍然会将消息广播给呼叫用户。

有没有人对如何向除发件人之外的所有连接用户广播邮件有任何想法?

4 个答案:

答案 0 :(得分:3)

您无需保存用户ID并管理个人排放,您可以指定没有发件人emit('my_event', {data:my_data}, broadcast=True, include_self=False)的广播。在你的情况下,它将是这样的:

@socketio.on('send_message')
    def handle_source(json_data):
        text = json_data['message'].encode('ascii', 'ignore')
        emit('echo', {'echo': 'Server Says: '+text}, broadcast=True, include_self=False)

如果您必须为特定客户群发送消息,则可以创建rooms,然后使用emit('my_event', {data:my_data}, room=my_room, include_self=False)向加入my_room的客户发送消息。您可以查看flask_socketio.emit的参考信息以获取更多详细信息。

答案 1 :(得分:1)

我无法对@ Alex的回复发表评论,因为我没有足够的声誉,但如果您想发出广播消息,这就是在Python中完成的方式:

emit('echo', {'data':'what ever you are trying to send'},  broadcast=True)

答案 2 :(得分:0)

您可以尝试使用socket.broadcast.emit代替socket.emit。我不确定这是否适用于Python库,但它是您在Socket.io for Node.js中寻找的语法。

答案 3 :(得分:0)

https://flask-socketio.readthedocs.io/en/latest/#flask_socketio.SocketIO.emit

您正在寻找skip_sid的{​​{1}}参数。

  

skip_sid –广播或广播时要忽略的客户端的会话ID   寻址房间。通常将其设置为   消息,以便除该客户端之外的所有人都收到该消息。至   跳过多个sid传递列表。