当我启动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();
});
答案 0 :(得分:30)
Socket.io 0.7以后将尝试重用连接到同一主机。根据我的经验,我发现这种行为可能有点不稳定。
我无法从您提供的小代码示例中看出,但我怀疑问题是第二次调用connect()
正在尝试重用第一个(已关闭)连接。
解决方法是在致电'force new connection'
时传递connect()
选项。例如:
io.connect("http://localhost", {'force new connection': true});
答案 1 :(得分:1)
您的第二行会丢弃第一行中创建的对象。简单地这样做应该有效:
var socket = io.connect();
第一次发送和第二次失败的问题可能是由于浏览器/协议。我已经看到过Internet Explorer和XHR传输的这种行为,以及使用JSONP的Opera。
如果您使用的是IE,请尝试切换到JSONP,它应该可以正常工作。这可以在服务器端完成,方法是将传输列表提供给配置。只需确保JSONP出现在XHR之前。像这样:
sio.set('transports', [
'websocket'
, 'flashsocket'
, 'jsonp-polling'
, 'xhr-polling'
, 'htmlfile'
]);
答案 2 :(得分:1)
从socket.io 1.0开始,有两个设置控制此行为:
"force new connection":true
,在客户端connect()调用。
"cookie":false
,在服务器Server()构造函数上。
显然,两者都产生完全相同的行为。
截至今天,第二种方法是无证件的。但是,查看源代码,您可以看到传递给socket.io Server()的所有选项都传递给内部Engine.io库Server()构造函数,该构造函数允许您更改其中的任何选项。这些选项记录在这里: