2013-03-14 3 views
4

Я работаю в чате, и я заметил, что иногда соединение между моим сервером node.js и клиентом iOS будет отключено сразу после того, как сервер выдаст некоторые данные.socket.io emit data отключит клиента

Я emited два события непрерывно, на основе журналов на клиенте, то оказывается, что излучаемые данные «в сочетании»:

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() 

Я могу воспроизвести эту проблему последовательно. Нормально ли, что данные «объединены»? Почему это отключение происходит?

EDIT: Мне удалось упростить мои вопросы, в чем-то очень простое:

Этот кусок кода в порядке:

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"}); 
    }); 

Нельзя ли постоянно выпускать что-то в розетку? Должен ли я сам реализовать какую-то очередь, чтобы гарантировать, что каждый сокет будет успешным, прежде чем я выпущу следующие данные?

===== ===== ОБНОВЛЕНИЕ

р/с 1: Это происходит только на Objective-C клиента. Если я использую javascript-клиент, я могу получить два события.

p/s 2: Мне удалось воспроизвести проблему в очень простой настройке: a. Во-первых, сервер, который просто испускает два события при соединении: io.sockets.on ('connection', function (socket) { socket.emit ("message", {"text": "welcome2!" }); socket.emit ("сообщение", { "текст": "welcome3".});} б Во-вторых, простой клиент 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"}]; 
} 

с выход из 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! 
+0

у вас есть плохие данные в строках? – kobe

+0

нет, они являются нормальными данными .. – mkto

+0

показать свой код для узла и клиента. – user568109

ответ

2

После небольшого копания, это appea rs проблема сводится к тому, как socket.io объединяет несколько сообщений в один пакет.

В двух выпусках (#65#83) изображена проблема и подробно обсуждается проблема.

Таким образом, библиотека socket.IO-objc не обрабатывала эти особые случаи и всегда предполагала, что пакет содержит только одно сообщение.

Выпуск № 65 для справки:

Каждый раз в то время (во время тяжелых сокетов трафика), сервер может решить послать полезную нагрузку, где несколько пакетов возвращаются в одного ответа опроса (если например, с использованием xhr-опроса).Они отделены друг от друга \ ufffd характер, и включают в себя длину в байтах каждого пакета, как:

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

длина] [packet_n]

В настоящее время, я считаю, Ondata просто обрабатывает данные , как один пакет, но бывают случаи, когда сервер отправляет несколько пакетов в одном ответе.

Примечание является символом \ufffd.

A fix has been submitted более ранний и выглядит как на рассмотрении, так и на этой публикации.

Смежные вопросы