Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用socket.io从服务器调用客户端方法_Javascript_Python_Websocket_Flask - Fatal编程技术网

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

Javascript 如何使用socket.io从服务器调用客户端方法,javascript,python,websocket,flask,Javascript,Python,Websocket,Flask,我正在为服务器使用flask socketio,并使用以下代码从服务器调用客户机函数。这是正确的方法吗?还是有更好的办法 服务器 @socketio.on('connect', namespace='/test') def test_connect(): sleep(5) emit('my response', {'data': 'myFunction', 'parameter': 2}) emit('new-points', { 'data': 'IncreaseB

我正在为服务器使用flask socketio,并使用以下代码从服务器调用客户机函数。这是正确的方法吗?还是有更好的办法

服务器

@socketio.on('connect', namespace='/test')
def test_connect():
    sleep(5)
    emit('my response', {'data': 'myFunction', 'parameter': 2})
emit('new-points', {
     'data': 'IncreaseBarHeight',
     'parameter': '10px',
     'user': '3476'
})
emit('new-points', {'points': 3560, 'user': '8376'})
客户

socket.on('my response', function(msg) {
    console.log(msg)
    window[msg.data]({parameter1 : msg.parameter});
}
socket.on('new-points', function(msg) {
    window[msg.data]({height : msg.parameter});
    //this would trigger global IncreaseBarHeight('10px', msg.user)
}
socket.on('new-points', function(msg) {
    SetBarHeight(msg.points, msg.user); //set height based on total points
}

<强>服务器不应该显式地调用客户端上的任何函数。< /强>客户端和服务器是不同的应用程序,它们通过请求“相互”交谈,但我会考虑有一个知道客户端中函数名称的服务器的坏实践,客户端如何处理响应,或者可视化界面是如何工作的。类似地,如果客户机知道特定于服务器的实现,并告诉它要使用哪个数据库,这将非常糟糕

这很简单。另外,请阅读有关客户机-服务器域分离的内容。无论如何,我不知道您的具体应用,但是让我们来看一个实际的例子:

假设您的应用程序是堆栈溢出的修改版本。当用户对答案进行投票时,服务器会收到通知,客户端应用程序必须在显示所有用户的页面上更改该用户的条形高度(根据新点数)

按照您今天的实现设计,将会发生以下情况:

服务器

@socketio.on('connect', namespace='/test')
def test_connect():
    sleep(5)
    emit('my response', {'data': 'myFunction', 'parameter': 2})
emit('new-points', {
     'data': 'IncreaseBarHeight',
     'parameter': '10px',
     'user': '3476'
})
emit('new-points', {'points': 3560, 'user': '8376'})
客户

socket.on('my response', function(msg) {
    console.log(msg)
    window[msg.data]({parameter1 : msg.parameter});
}
socket.on('new-points', function(msg) {
    window[msg.data]({height : msg.parameter});
    //this would trigger global IncreaseBarHeight('10px', msg.user)
}
socket.on('new-points', function(msg) {
    SetBarHeight(msg.points, msg.user); //set height based on total points
}
因此,客户机对界面有一些了解,它知道UI中有一个条,高度应该增加。如果我决定更改UI,并且只使用数字而不是条,那么我还必须重新实现服务器。他们太结合了

这是一种更好的方法:

服务器

@socketio.on('connect', namespace='/test')
def test_connect():
    sleep(5)
    emit('my response', {'data': 'myFunction', 'parameter': 2})
emit('new-points', {
     'data': 'IncreaseBarHeight',
     'parameter': '10px',
     'user': '3476'
})
emit('new-points', {'points': 3560, 'user': '8376'})
客户

socket.on('my response', function(msg) {
    console.log(msg)
    window[msg.data]({parameter1 : msg.parameter});
}
socket.on('new-points', function(msg) {
    window[msg.data]({height : msg.parameter});
    //this would trigger global IncreaseBarHeight('10px', msg.user)
}
socket.on('new-points', function(msg) {
    SetBarHeight(msg.points, msg.user); //set height based on total points
}

服务器不知道客户端将如何使用这些信息,因此它们不耦合。我可以更改点的UI表示,而无需修改服务器。这是有意义的吗?< /P> < P> <强>服务器不应该试图显式地调用客户端上的任何函数。<强>客户端和服务器是不同的应用程序,它们通过请求“相互”交谈,但我会考虑有一个知道客户端中函数名称的服务器的坏实践,客户端将如何处理响应,或者可视化界面如何工作。类似地,如果客户机知道特定于服务器的实现,并告诉它要使用哪个数据库,这将非常糟糕

这很简单。另外,请阅读有关客户机-服务器域分离的内容。无论如何,我不知道您的具体应用,但是让我们来看一个实际的例子:

假设您的应用程序是堆栈溢出的修改版本。当用户对答案进行投票时,服务器会收到通知,客户端应用程序必须在显示所有用户的页面上更改该用户的条形高度(根据新点数)

按照您今天的实现设计,将会发生以下情况:

服务器

@socketio.on('connect', namespace='/test')
def test_connect():
    sleep(5)
    emit('my response', {'data': 'myFunction', 'parameter': 2})
emit('new-points', {
     'data': 'IncreaseBarHeight',
     'parameter': '10px',
     'user': '3476'
})
emit('new-points', {'points': 3560, 'user': '8376'})
客户

socket.on('my response', function(msg) {
    console.log(msg)
    window[msg.data]({parameter1 : msg.parameter});
}
socket.on('new-points', function(msg) {
    window[msg.data]({height : msg.parameter});
    //this would trigger global IncreaseBarHeight('10px', msg.user)
}
socket.on('new-points', function(msg) {
    SetBarHeight(msg.points, msg.user); //set height based on total points
}
因此,客户机对界面有一些了解,它知道UI中有一个条,高度应该增加。如果我决定更改UI,并且只使用数字而不是条,那么我还必须重新实现服务器。他们太结合了

这是一种更好的方法:

服务器

@socketio.on('connect', namespace='/test')
def test_connect():
    sleep(5)
    emit('my response', {'data': 'myFunction', 'parameter': 2})
emit('new-points', {
     'data': 'IncreaseBarHeight',
     'parameter': '10px',
     'user': '3476'
})
emit('new-points', {'points': 3560, 'user': '8376'})
客户

socket.on('my response', function(msg) {
    console.log(msg)
    window[msg.data]({parameter1 : msg.parameter});
}
socket.on('new-points', function(msg) {
    window[msg.data]({height : msg.parameter});
    //this would trigger global IncreaseBarHeight('10px', msg.user)
}
socket.on('new-points', function(msg) {
    SetBarHeight(msg.points, msg.user); //set height based on total points
}

服务器不知道客户端将如何使用这些信息,因此它们不耦合。我可以更改点的UI表示,而无需修改服务器。有意义吗?

谢谢你这么详细的回答。这是非常有用的。谢谢你这么详细的回答。这是非常有用的。