2013-03-14 10 views
4

채팅 중일 때 서버에서 일부 데이터가 출력 된 직후 node.js 서버와 iOS 클라이언트 간의 연결이 끊어지는 경우가 있습니다. socket.io에서 데이터를 내보내면 클라이언트 연결이 끊어집니다.

내가 클라이언트의 로그를 기반으로, 두 가지 이벤트가 지속적으로 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() 

내가 일관되게이 문제를 재현 할 수 있습니다. 데이터가 "결합"되는 것이 정상입니까? 이 연결이 끊어지는 이유는 무엇입니까?

편집 :

이 코드 조각은 괜찮 : 코드의이 작품은 클라이언트! :

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

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

정말 간단한 무언가로 내 문제를 단순화하기 위해 관리

소켓에 계속해서 어떤 것을 방출 할 수 있습니까? 나는 모든 데이터를 보내기 전에 모든 socket.emit이 성공했는지 확인하기 위해 일종의 대기열을 직접 구현해야한다고 생각하십니까?

===== UPDATE =====

P/s의 1 :이 내용은 목표 - C 클라이언트에서 발생합니다. 자바 스크립트 클라이언트를 사용하면 두 이벤트를 수신 할 수 있습니다.

p/s 2 : 아주 간단한 설정으로 문제를 재현 할 수있었습니다 : a. 첫째, 서버가 연결되면 두 개의 이벤트를 내 보낸다. io.sockets.on ('connection', function (socket) { socket.emit ("message", { "text": "welcome2!" }); socket.emit ("메시지", { "텍스트": "welcome3."}); } B 둘째, 여기에서 socket.IO-OBJ 라이브러리를 사용하여 간단한 아이폰 OS 클라이언트 (: https://github.com/pkyeck/socket.IO-objc)

. 아이폰 OS 클라이언트에서
- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    socketIO = [[SocketIO alloc] initWithDelegate:self]; 
    [socketIO connectToHost:@"192.168.1.87" onPort:5000 withParams:@{@"token":@"avalidtoken"}]; 
} 

C 출력 : 조금 파고 후

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 이 문제는 socket.io가 여러 메시지를 하나의 패킷으로 묶는 방법에 달려 있습니다.

두 가지 문제 (#65#83)는 문제를 직접 보여 주며 문제에 대해 자세히 논의합니다.

요약하면 socket.IO-objc 라이브러리는 이러한 특수한 경우를 처리하지 않았으며 항상 패킷에 단일 메시지 만 포함되었다고 가정합니다. 참조

이슈 # 65 :

번 동안의 모든 (무거운 소켓 트래픽 중), 서버는 (있는 경우 여러 패킷을 하나의 설문 조사 응답에 반환되는 페이로드를 보내도록 결정할 수 있습니다 예를 들어 xhr-polling 사용).[packet_n]

현 난으로 onData 단지로서 데이터를 처리 판단

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

길이 : 그들은 \ ufffd을 문자로 구분 하고, 같은 각 패킷의 바이트 길이를 포함 단일 패킷이지만 서버가 단일 응답으로 복수 패킷을 보내는 경우가 있습니다.

참고 012는 \ufffd 문자입니다.

이전에이 게시물을 검토중인 것으로 보입니다.

관련 문제