SocketIO发送给特定用户(不为每个客户端使用单独的房间)



我正在尝试开发一个支持后端长任务的web应用程序。我在我的服务器上使用flask-socketio包和芹菜。我的工作流程如下:

  1. 当客户端打开Html页面时,我启动一个套接字连接到服务器,该服务器为用户创建一个uid并将其发送回。
  2. 现在,一旦用户发布了长任务的请求——我使用芹菜调度它,一旦完成,我需要将其发送给发布请求的用户。(我在post request中存储了相关的用户id)

我看了@Miguels对39423646/flask-socketio-emit-to-specific-user的回答,它为每个用户创建一个单独的房间,然后在那个房间广播消息。但是我想问一下是否有其他更简单的方法来做到这一点,因为这样做似乎效率低下或强制。

我还遇到了nodejs解决方案(如何使用socket-io向特定客户端发送消息),我觉得这是一种更自然的方式来完成此任务。在python-socketio中也有类似的解决方案吗?


更新经过更多的搜索,我在github要点上遇到了以下解决方案。根据这个——** flash-socketIO已经把所有的客户端放在request.sid**给出的单独的房间里。

我仍然希望讨论其他方法来做到这一点。特别是如果网站流量非常高——它不会导致太多的房间吗?


更新(2):我当前的(工作的)服务器代码使用房间. 这是从flask-SocketIO芹菜的例子中借用和修改的

@celery.task(bind=True)
def long_task(self, userid, url):
# LONG TASK
time.sleep(10)
# meta = some result
post(url, json=meta) 
# It seems i can't directly emit from celery function so I mimic a post request and emit from that function 
return meta
@app.route('/longtask', methods=['POST'])
def longtask():
userid = request.json['userid']
task = long_task.delay(elementid, userid, url_for('event', _external=True))
return jsonify({}), 202
@socketio.on('connect', namespace='/custom')
def events_connect():
userid = str(uuid.uuid4())
session['userid'] = userid
current_app.clients[userid] = request.sid
emit('userid', {'userid': userid})
@app.route('/event/', methods=['POST'])
def event():
userid = request.json['userid']
data = request.json
roomid = app.clients.get(userid)
socketio.emit('celerystatus', data, namespace='/custom', room=roomid)
return 'ok'


您不必为单个用户创建任何房间。只需将to参数设置为您想要处理的用户的sid:

emit('my event', my_data, to=user_sid)

分配给每个用户的sid值在connect事件处理程序中作为request.sid提供给您。

您可以为每个单独的用户创建一个房间。您可以向特定房间的用户发送您想要共享的消息。

io.to(user.room).emit('specific-user', { message });

这里的意思是单独的用户房间,你需要为聊天室定义一个房间id,就像一个聊天应用程序(一对一通信)。房间id可以连接自己的id和用户id,您希望为每个用户发送唯一房间id的消息。

相关内容

最新更新