Nodejs websocket:如何在没有服务器响应的情况下连续发送客户端消息
Nodejs websocket: how to continuously send client message without server response
我是 Nodejs 基于事件的异步通信的新手。对于Websocket Client-Server 通信,我目前了解的是,在socket 连接建立后,客户端和服务器基于事件触发器相互通信。
在客户端,我正在创建一个新的 websocket 并与 Nodejs 服务器通信。到目前为止,我的客户端事件是:
1. socket.on('open', function open() {}
2. socket.on('message', function message(data) {}
3. socket.on('close', function close() {}
4. socket.on('error', function error(err) {}
建立套接字后,每次服务器发送响应消息时都会触发socket.on('message'
。目前我正在这个函数内向服务器发送一条客户端消息。
但是,服务器端逻辑是这样的,客户端会不断发送消息,服务器会接受,但可能不会回复。因此,socket.on('message'
可能不会一直被触发,因此,根据我的逻辑,如果服务器没有响应,我将无法从客户端发送更多消息!
我试过的解决方法:
在 socket.on('open'
的回调函数中,我保留了一个 async.whilst()
循环以不断向服务器发送消息。在 socket.on('open'
之外,我保留上面列出的其余事件。
但是,当我是 运行 代码时,来自客户端的所有消息都一个接一个地按顺序发送,但是 socket.on('message'
根本没有被触发。从服务器日志我已经确认服务器正在正确发送消息。
从这个行为看来,while 循环实际上表现得像一个阻塞 while 循环,这是我不想要的!我在这里做错了什么?
由于保密问题,我无法粘贴我拥有的全部源代码,但我将使用 async.whilst()
循环粘贴我的 socket.on('open'
正文。另外,我正在为其他事件添加占位符。
代码如下:
var count=10;
socket.on('open', function open() {
async.whilst(
function () { return count>=0; },
function (callback) {
console.log("Allowed to send msgs? YES");
senddataToServer(socket); //This function sends data to server using a callback function to catch error, hence asynchronous.
count--;
callback();
},
function (err) {
console.log("Allowed to send msgs? NO");
socket.close();
}
);
});
socket.on('message', function message(data) {}
socket.on('close', function close() {}
socket.on('error', function error(err) {}
senddataToServer(socket){}
我从这个 link 得到了 async.whilst
的代码:whilst(test, fn, callback)
您需要决定要触发客户端向服务器发送新数据的方式。您不应使用来自服务器的传入消息来触发与传入服务器消息无关的客户端发送。
触发客户端发送的选项是:
使用 setTimeout()
或 setInterval()
定期向服务器发送内容(例如,每 30 秒)。
响应客户端中的某些事件并将其用作将数据发送到服务器的触发器(例如按钮单击、鼠标移动、数据到达等...)。
如果您能更具体地说明要发送到服务器的内容以及何时适合将其发送到服务器,我们可以更具体地建议如何最好地安排或触发发送。
我是 Nodejs 基于事件的异步通信的新手。对于Websocket Client-Server 通信,我目前了解的是,在socket 连接建立后,客户端和服务器基于事件触发器相互通信。
在客户端,我正在创建一个新的 websocket 并与 Nodejs 服务器通信。到目前为止,我的客户端事件是:
1. socket.on('open', function open() {}
2. socket.on('message', function message(data) {}
3. socket.on('close', function close() {}
4. socket.on('error', function error(err) {}
建立套接字后,每次服务器发送响应消息时都会触发socket.on('message'
。目前我正在这个函数内向服务器发送一条客户端消息。
但是,服务器端逻辑是这样的,客户端会不断发送消息,服务器会接受,但可能不会回复。因此,socket.on('message'
可能不会一直被触发,因此,根据我的逻辑,如果服务器没有响应,我将无法从客户端发送更多消息!
我试过的解决方法:
在 socket.on('open'
的回调函数中,我保留了一个 async.whilst()
循环以不断向服务器发送消息。在 socket.on('open'
之外,我保留上面列出的其余事件。
但是,当我是 运行 代码时,来自客户端的所有消息都一个接一个地按顺序发送,但是 socket.on('message'
根本没有被触发。从服务器日志我已经确认服务器正在正确发送消息。
从这个行为看来,while 循环实际上表现得像一个阻塞 while 循环,这是我不想要的!我在这里做错了什么?
由于保密问题,我无法粘贴我拥有的全部源代码,但我将使用 async.whilst()
循环粘贴我的 socket.on('open'
正文。另外,我正在为其他事件添加占位符。
代码如下:
var count=10;
socket.on('open', function open() {
async.whilst(
function () { return count>=0; },
function (callback) {
console.log("Allowed to send msgs? YES");
senddataToServer(socket); //This function sends data to server using a callback function to catch error, hence asynchronous.
count--;
callback();
},
function (err) {
console.log("Allowed to send msgs? NO");
socket.close();
}
);
});
socket.on('message', function message(data) {}
socket.on('close', function close() {}
socket.on('error', function error(err) {}
senddataToServer(socket){}
我从这个 link 得到了 async.whilst
的代码:whilst(test, fn, callback)
您需要决定要触发客户端向服务器发送新数据的方式。您不应使用来自服务器的传入消息来触发与传入服务器消息无关的客户端发送。
触发客户端发送的选项是:
使用
setTimeout()
或setInterval()
定期向服务器发送内容(例如,每 30 秒)。响应客户端中的某些事件并将其用作将数据发送到服务器的触发器(例如按钮单击、鼠标移动、数据到达等...)。
如果您能更具体地说明要发送到服务器的内容以及何时适合将其发送到服务器,我们可以更具体地建议如何最好地安排或触发发送。