我是Nodejs基于事件的异步通信的新手。对于Websocket客户端 - 服务器通信,我现在想到的是,在建立套接字连接之后,客户端和服务器根据事件触发器相互通信。
在客户端,我正在创建一个新的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循环,我不想要!我在这里做错了什么?
由于机密性问题,我无法粘贴完整的源代码,但是我使用socket.on('open'
循环粘贴了async.whilst()
正文。另外,我正在为其他活动添加占位符。
以下是代码:
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){}
我从此链接获得了async.whilst
的代码:whilst(test, fn, callback)
答案 0 :(得分:0)
您需要决定要触发客户端向服务器发送新数据的内容。您不应该使用来自服务器的消息的传入到达来触发与传入服务器消息无关的客户端发送。
您触发客户端发送的选项是:
使用setTimeout()
或setInterval()
定期向服务器发送内容(例如每30秒)。
响应客户端中的某些事件,并将其用作将数据发送到服务器的触发器(例如按钮单击,鼠标移动,数据到达等)。
如果您更具体地了解您尝试发送到服务器的内容以及何时将其发送到服务器,我们可以更具体地建议如何最好地安排或触发发送。