socket.io – 第一次工作,而不是第二次

当我启动我的node.js服务器和客户端连接,我能够发送来自客户端(socket.emit)的请求,并得到一个响应(socket.on('rentsAround'….))。 但是当我第二次连接时,客户端可以发送,但服务器不能发送或发送。 所以我必须重新启动服务器。 我明白,这是按预期工作,但不知何故,我的理解是错的地方…有人请指出。

客户端:========

var socket = new io.Socket(); socket = io.connect(); socket.on('rentsAround', function(data){ registration.handleRentsAround(data); }); socket.on('locationDetailsRes', function(data){ registration.handleRentsAround(data); }); socket.on('connect', function(data){ alert('inside connect on client side'); }); socket.on('disconnect', function(){ // do something, if you want to. }); ............. socket.emit("searchRent", {"lat":lat, "lng":lng}); 

服务器端:========

 socket.sockets.on('connection', function(client){ client.on('searchRent', function(msg){ console.log('inside on connection'); // do something and reply back client.emit('rentsAround',{"totalRents":docs.length, "rents":docs}); }); client.on('disconnect', function(){ sys.puts("client disconnect"); mongoose.disconnect(); }); 

Socket.io 0.7以后将尝试重用到同一主机的连接。 根据我的经验,我发现这种行为可以是一个小小的风格。

我不能从你提供的小代码示例中知道,但我怀疑问题是第二次调用connect()试图重用第一个(closures)连接。

解决方法是在调用connect()时传递'force new connection'选项。 例如:

io.connect("http://localhost", {'force new connection': true});

您的第二行放弃在第一行创build的对象。 简单地做这个工作应该是:

 var socket = io.connect(); 

第一次发送和第二次失败的问题可能是由于浏览器/协议。 我已经看到了Internet Explorer和XHR传输的这种行为,以及使用JSONP的Opera。

如果您使用IE,请尝试切换到JSONP,它应该正常工作。 这可以在服务器端通过提供传输列表到configuration来完成。 只要确保JSONP在XHR之前。 像这样的东西:

 sio.set('transports', [ 'websocket' , 'flashsocket' , 'jsonp-polling' , 'xhr-polling' , 'htmlfile' ]); 

从socket.io 1.0开始,两个设置控制着这个行为:

  • "force new connection":true ,在客户端connect()调用。

  • "cookie":false ,在服务器的Server()构造函数中。

显然,两者都产生完全相同的行为。

到今天为止,第二种方法是无证的。 然而,看看源代码,你可以看到所有传递给socket.io Server()的选项都被传递给内部的Engine.io库的Server()构造函数,它可以让你改变那里的任何选项。 这些选项logging在这里:

https://github.com/LearnBoost/engine.io