socket.io发射数据将断开客户端

我正在聊天,我注意到,有时候我的node.js服务器和iOS客户端之间的连接将在服务器发出一些数据后立即断开连接。

我根据客户端上的日志,连续两个事件,看起来排放的数据是“结合”的:

doQueue() >> 0 2013-03-16 05:11:45.390 [833:907] start/reset timeout 2013-03-16 05:11:45.491 [833:907] onData  187 5:::{"name":"threadInformation","args":[{"threadObjects":[{"threadId":"heacrsi1","users":[{"userName":"tester","userId":"123"},{"userName":"Name","userId":"123"}]}]}]} 171 5:::{"name":"message","args":[{"fromUserName":"tester","fromUserId":"123","text":"heiiiii this is going to trigger a message for u!","threadId":"heacrsi1","messageId":1}]} 2013-03-16 05:11:45.493 [833:907] start/reset timeout 2013-03-16 05:11:45.495 [833:907] disconnect 2013-03-16 05:11:45.496 [833:907] onDisconnect() 

我可以一贯地重现这个问题。 数据“合并”是否正常? 为什么这个断开连接发生?

编辑:我设法简化我的问题到一个非常简单的事情:

这段代码是好的:

  socket.on('online', function(data){ socket.emit("message", {"testField":"testData2"}); }); 

这段代码断开客户端!:

  socket.on('online', function(data){ socket.emit("message", {"testField":"testData"}); socket.emit("message", {"testField":"testData2"}); }); 

我们是否被允许连续发射一些东西到套接字? 我应该自己实现某种队列,以确保每个socket.emit都成功,然后我发出下一个数据?

=====更新=====

p / s 1:这只发生在objective-c客户端上。 如果我使用JavaScript客户端,我可以收到这两个事件。

p / s 2:我设法以非常简单的方式重现问题:a。 首先,一个服务器,当发生连接时,它只发出两个事件:io.sockets.on('connection',function(socket){socket.emit(“message”,{“text”:“welcome2!”));其次,一个简单的iOS客户端(从这里使用socket.IO-obj库: https : //github.com/pkyeck/ socket.IO-objc )

 - (void) viewDidLoad { [super viewDidLoad]; socketIO = [[SocketIO alloc] initWithDelegate:self]; [socketIO connectToHost:@"192.168.1.87" onPort:5000 withParams:@{@"token":@"avalidtoken"}]; } 

C。 从iOS客户端输出:

  2013-03-21 01:13:39.355 SocketTesterARC[6391:907] Connecting to socket with URL: http://192.168.1.87:5000/socket.io/1/?t=16807&token=avalidtoken 2013-03-21 01:13:39.620 SocketTesterARC[6391:907] didReceiveResponse() 200 2013-03-21 01:13:39.621 SocketTesterARC[6391:907] connectionDidFinishLoading() fvSZFJMiIXop5uMayU0t:60:60:xhr-polling 2013-03-21 01:13:39.622 SocketTesterARC[6391:907] sid: fvSZFJMiIXop5uMayU0t 2013-03-21 01:13:39.656 SocketTesterARC[6391:907] heartbeatTimeout: 67.000000 2013-03-21 01:13:39.657 SocketTesterARC[6391:907] transports: ( "xhr-polling" ) 2013-03-21 01:13:39.658 SocketTesterARC[6391:907] xhr polling supported -> using it now 2013-03-21 01:13:39.680 SocketTesterARC[6391:907] onData 1:: 2013-03-21 01:13:39.681 SocketTesterARC[6391:907] start/reset timeout 2013-03-21 01:13:39.683 SocketTesterARC[6391:907] connected 2013-03-21 01:13:39.684 SocketTesterARC[6391:907] onConnect() 2013-03-21 01:13:39.685 SocketTesterARC[6391:907] connected to server successfully 2013-03-21 01:13:39.686 SocketTesterARC[6391:907] doQueue() >> 0 2013-03-21 01:13:39.687 SocketTesterARC[6391:907] start/reset timeout 2013-03-21 01:13:39.698 SocketTesterARC[6391:907] onData  52 5:::{"name":"message","args":[{"text":"welcome2!"}]} 52 5:::{"name":"message","args":[{"text":"welcome3!"}]} 2013-03-21 01:13:39.700 SocketTesterARC[6391:907] start/reset timeout 2013-03-21 01:13:39.701 SocketTesterARC[6391:907] disconnect 2013-03-21 01:13:39.702 SocketTesterARC[6391:907] onDisconnect() 2013-03-21 01:13:39.708 SocketTesterARC[6391:907] disconnected! error: Error Domain=SocketIOError Code=-2 "The operation couldn't be completed. (SocketIOError error -2.)" 2013-03-21 01:13:44.687 SocketTesterARC[6391:907] disconnect! 

经过一点挖掘,看来问题是如何socket.io将多个邮件分组到一个单一的数据包。

两个问题( #65 #83 )描述了这个问题,并进一步详细讨论了这个问题。

总而言之,socket.IO-objc库并没有处理这些特殊的情况,总是假设一个数据包只包含一个消息。

问题#65供参考:

每隔一段时间(在重载套接字通信期间),服务器可以决定发送在单个轮询响应中返回多个分组的有效载荷(例如,如果使用xhr-polling)。 它们由\ ufffd字符分隔,并包含每个数据包的字节长度,如:

  [packet_0 length] [packet_0] [packet_1 length] [packet_1] [packet_n 

长度] [packet_n]

目前,我相信onData只是将数据作为一个单独的数据包来处理,但是有些情况下,服务器会在一个响应中发送多个数据包。

注意 是\ufffd字符。

修补程序已经提交 ,看起来是在审查本post。