簡體   English   中英

向所有連接的客戶端廣播,除了使用python flask socketio的發件人

[英]Broadcast to all connected clients except sender with python flask socketio

我正在關注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()仍然會將消息廣播給呼叫用戶。

有沒有人對如何向除發件人之外的所有連接用戶廣播消息有任何想法?

您不必保存用戶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)

如果您必須為特定客戶端組發送消息,則可以創建會議室 ,然后使用emit('my_event', {data:my_data}, room=my_room, include_self=False)向已加入my_room客戶發送消息。 您可以查看flask_socketio.emit的參考資料以獲取更多詳細信息。

我無法對@ Alex的回復發表評論,因為我沒有足夠的聲譽,但如果你想發出廣播信息,這就是在Python中完成的方式:

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

您可以嘗試使用socket.broadcast.emit而不是socket.emit 我不確定這是否適用於Python庫,但它是您在Socket.io for Node.js中尋找的語法。

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

您正在尋找socketio.emit()skip_sid參數。

skip_sid - 廣播或尋址房間時要忽略的客戶端的會話ID。 這通常設置為消息的發起者,以便除客戶端之外的所有人都接收消息。 要跳過多個sid,請傳遞一個列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM