我正在聊天,我注意到有时我的 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:我设法在一个非常简单的设置中重现了这个问题:首先,一个服务器在建立连接时简单地发出两个事件: io.sockets.on('connection', function(socket) { socket.emit("message", {"text":"welcome2!"}); socket.emit("message", {"text":"welcome3!"}); } b. 其次,一个简单的 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!