第一次在这里发海报。我正在尝试使用 Flask-SocketIO 组合一个聊天室应用程序,并且很难让一个微小但至关重要的部分工作。当我在服务器中调用 emit 方法并设置 broadcast=True 标志时,预期的行为是它会在客户端为所有用户(包括发送者)触发相应的 socket.on 事件。但是,我的代码显然只对发件人以外的所有客户端执行此操作。这与https://flask-socketio.readthedocs.io/en/latest/上的文档相反,其中指出:
在启用广播选项的情况下发送消息时,连接到命名空间的所有客户端都会收到它,包括发送者。当不使用命名空间时,连接到全局命名空间的客户端会收到消息。
我需要它来发送消息并为发送者以及所有其他客户端触发 socket.on 事件。谁能解释我在这里做错了什么?因为这似乎是一个基本功能,我一定错过了一些非常明显的东西。
服务器代码:
import os
import requests
from flask import Flask, jsonify, render_template, request
from flask_socketio import SocketIO, emit, join_room, leave_room
app = Flask(__name__)
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY')
socketio = SocketIO(app)
channels = ['a', 'b', 'c', 'testing', 'abc', '123']
ch_msgs = {'a': ['testing', '1234', 'high five'], 'b': ['hello']}
msg_limit = 100
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('add channel')
def add(data):
new_channel = data
channels.append(new_channel)
ch_msgs[new_channel] = list()
emit('announce channel', new_channel, broadcast=True)
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
Javascript:
document.addEventListener('DOMContentLoaded', () => {
var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port);
socket.on('connect', () => {
document.querySelector('#add_channel').onclick = () => {
const new_channel = document.querySelector('#new_channel').value;
socket.emit('add channel', new_channel);
};
});
socket.on('announce channel', data => {
const li = document.createElement('li');
li.innerHTML = '#' + `${data}`;
$('#channel_list').append(li);
});
});
白猪掌柜的
相关分类