4

私はチャットに取り組んでいますが、サーバーがデータを送信した直後に、node.js サーバーと iOS クライアントの間の接続が切断されることがあることに気付きました。

クライアントのログに基づいて、2 つのイベントを継続的に発行しました。発行されたデータは「結合」されているようです。

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 クライアントを使用すると、2 つのイベントを受け取ることができます。

p/s 2: 非常に簡単なセットアップで問題を再現できました。まず、接続が確立されたときに単純に 2 つのイベントを発行するサーバーです。 socket.emit("message", {"text":"welcome3!"}); } b. 次に、単純な iOS クライアント ( https://github.com/pkyeck/の socket.IO-obj ライブラリを使用) 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!
4

1 に答える 1

2

少し調べてみると、socket.io が複数のメッセージを 1 つのパケットにグループ化する方法に問題があるようです。

2 つの問題 ( #65 #83 ) は、当面の問題を示し、問題についてさらに詳しく説明します。

要約すると、socket.IO-objc ライブラリはこれらの特殊なケースを処理せず、パケットには単一のメッセージのみが含まれていると常に想定していました。

参照のための問題 #65:

ときどき (ソケットのトラフィックが多いとき)、サーバーは、単一のポーリング応答で複数のパケットが返されるペイロードを送信することを決定できます (たとえば、xhr-polling を使用している場合)。これらは \ufffd 文字で区切られ、次のように各パケットのバイト長が含まれます。

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

長さ]�[pack_n]

現在、onData はデータを 1 つのパケットとして処理しているだけだと思いますが、サーバーが 1 つの応答で複数のパケットを送信する場合があります。

注●は\ufffd文字です。

修正は以前に提出されており、この投稿の時点でレビュー中のようです。

于 2013-03-20T19:02:08.897 に答える