2015-02-23 78 views
0

我是Nodejs基于事件的异步通信的新手。对于Websocket客户端 - 服务器通信,我到目前为止已经发现,在套接字连接建立之后,客户端和服务器将基于事件触发器相互通信。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循环,我不想!我在这里做错了什么?

由于机密问题,我将无法粘贴我的所有源代码,但我正在使用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){} 

我从这个链接得到的代码async.whilstwhilst(test, fn, callback)

+0

不发送消息内部事件,根据需要从外部发送,而不是每消息一次。 – dandavis 2015-02-23 23:08:20

+0

我不知道如何从'需要外部'不断发送。这就是为什么我用async.whilst()尝试了一个备用解决方案。请检查'我尝试过的解决方案'部分。那部分也不起作用。因此,我发布了这个问题。谢谢! – kajarigd 2015-02-23 23:13:54

+0

它很简单,在你的代码中:'socket.send(“hello world”);'在任何地方运行。例如:'setInterval(function(){socket.send(+ new Date);},1000);'我根本看不到任何需要异步库的信息... – dandavis 2015-02-23 23:16:10

回答

0

您需要决定要触发客户端发送新数据到服务器的内容。您不应该使用来自服务器的消息的传入来触发与传入的服务器消息无关的客户端发送。

您的触发客户端发送选项:

  1. 使用setTimeout()setInterval()的东西发送到服务器定期时间间隔(如每30秒)。

  2. 响应客户端中的某些事件,并将其用作将数据发送到服务器的触发器(例如按钮单击,鼠标移动,数据到达等)。

如果您想更具体的了解你想要什么,发送到服务器,当它是适当的将其发送到服务器,我们可以建议更具体地约到最佳时间表或如何触发发送。

+0

客户端将开始发送“Hello “在websocket连接建立后立即连接到服务器。来自服务器的第一个“Hello”将触发处理某些内部逻辑的开始,并且在内部处理结束之前不会将任何回复发送回客户端。一旦处理结束,服务器将发回一个响应给客户端。但与此同时,客户会不断发送“你好”,不会停止。 – kajarigd 2015-02-23 23:23:20

+0

@kajarigd - 但为什么从客户端发送无意义的“hello”消息到服务器。客户端不应该在紧密循环中旋转,尽可能多地向服务器发送消息。这是可笑的低效率,似乎并没有实际完成任何事情。如果客户端使用电池供电的设备(例如平板电脑或智能手机),则会很快耗尽电池电量。而且,它将为客户端和服务器的互联网连接使用无意义的带宽。如果您描述的是您真正想要解决的问题,我们可以提供帮助,但我们需要真实的信息。 – jfriend00 2015-02-23 23:27:58

+0

其实,我向你解释了我对'你好'例子的要求。一旦创建了websocket,服务器的工作就是监视客户端的浏览器活动(鼠标移动,点击,关键字类型等)。根据客户在做什么样的活动,服务器会发送一个响应。服务器代码不在我的控制之下,因此我不确切知道哪些浏览器活动是有意义的以及在什么情况下。因此,我的工作是编写一个代码,客户端将不断发送浏览器活动到服务器。服务器将在需要时回复。 – kajarigd 2015-02-23 23:34:57

相关问题