如何通过socket.io从服务器调用客户端方法

0 投票
1 回答
860 浏览
提问于 2025-04-28 06:21

我正在使用flask-socketio作为服务器,并且有以下代码用来从服务器调用客户端的一个函数。这种做法对吗?还是有更好的方法?

服务器代码

@socketio.on('connect', namespace='/test')
def test_connect():
    sleep(5)
    emit('my response', {'data': 'myFunction', 'parameter': 2})

客户端代码

socket.on('my response', function(msg) {
    console.log(msg)
    window[msg.data]({parameter1 : msg.parameter});
}
暂无标签

1 个回答

5

服务器绝对不应该直接调用客户端的任何函数。 客户端和服务器是两个不同的应用程序,它们通过请求进行“对话”。如果服务器知道客户端的函数名称、如何处理响应,或者界面是怎么运作的,那就很糟糕。同样,如果客户端知道服务器的具体实现,比如告诉服务器用哪个数据库,那也是不好的。

这就是简单的关注点分离。另外,了解一下客户端-服务器的领域分离也很重要。无论如何,我不知道你的具体应用是什么,但我们来看一个实际的例子

假设你的应用是一个修改版的Stack Overflow。当用户给某个答案点赞时,服务器会收到通知,客户端应用需要根据新的积分调整某个用户在显示所有用户的页面上的条形图的高度……

根据你今天的实现设计,事情会这样发展:

服务器

emit('new-points', {
     'data': 'IncreaseBarHeight',
     'parameter': '10px',
     'user': '3476'
})

客户端

socket.on('new-points', function(msg) {
    window[msg.data]({height : msg.parameter});
    //this would trigger global IncreaseBarHeight('10px', msg.user)
}

所以客户端对界面有一些了解,它知道界面上有一个条形图,并且高度应该增加。如果我决定改变界面,只显示数字而不再用条形图,那我也得重新实现服务器。这两者太紧密了。

这是一种更好的方法:

服务器

emit('new-points', {'points': 3560, 'user': '8376'})

客户端

socket.on('new-points', function(msg) {
    SetBarHeight(msg.points, msg.user); //set height based on total points
}

服务器不知道客户端会如何使用这些信息,因此它们之间没有紧密联系。我可以改变积分的界面表现,而不需要修改服务器。这样说清楚了吗?

撰写回答