代码区项目交易流程

socket.io emit data will disconnect the client


I am working on a chat and I noticed that sometimes connection between my node.js server and iOS client will be disconnected right after server emitted some data.

I emited two events continuously, based on the logs on the client, it appears that the emitted data are "combined":

doQueue() >> 0 2013-03-16 05:11:45.390 [833:907] start/reset timeout 2013-03-16 05:11:45.491 [833:907] onData 1875:::{"name":"threadInformation","args":[{"threadObjects":[{"threadId":"heacrsi1","users":[{"userName":"tester","userId":"123"},{"userName":"Name","userId":"123"}]}]}]}1715:::{"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()

I can reproduce this problem consistently. Is it normal that the data is "combined"? Why is this disconnection happening?

EDIT: I managed to simplify my issues into something really simple:

This piece of code is okay:

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

This piece of code disconnects the client!:

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

Are we not allowed to emit something to a socket continuously? Am I supposed to implement some sort of queue myself to ensure every socket.emit is successful before i emit the next data?

===== UPDATE =====

p/s 1: This only happens on objective-c client. If I use a javascript client, I can receive the two events.

p/s 2: I managed to reproduce the problem in a very simple setup: a. First, a server that simply emits two events when a connection is made: io.sockets.on('connection', function(socket) { socket.emit("message", {"text":"welcome2!"}); socket.emit("message", {"text":"welcome3!"}); } b. Second, a simple iOS client (using socket.IO-obj library from here: 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. output from iOS client:

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 525:::{"name":"message","args":[{"text":"welcome2!"}]}525:::{"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!

Problem courtesy of: mkto

Solution

After a little digging, it appears the problem has come down to how socket.io will group together multiple messages into a single packet.

Two issues ( #65 #83 ) depicts the issue at hand and discuss further into detail about the problem.

In summary, the socket.IO-objc library did not handle these special cases and always assumed that a packet only contained a single message.

Issue #65 for reference:

Every once in a while (during heavy socket traffic), the server can decide to send a payload where multiple packets are returned in a single poll response (if using xhr-polling, for example). They are separated by the \ufffd character, and include the byte length of each packet, like:

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

Currently, I believe onData merely handles the data as a single packet, but there are cases when the server sends multiple packets in a single response.

Note is the \ufffd character.

A fix has been submitted earlier and looks to be in review as of this posting.

Solution courtesy of: travis

本文前端(javascript)相关术语:javascript是什么意思 javascript下载 javascript权威指南 javascript基础教程 javascript 正则表达式 javascript设计模式 javascript高级程序设计 精通javascript javascript教程

点击收藏

LAST Downloading a file from Autodesk A360 to a shopping cart in NodeJS Is there anything called a list set? NEXT