簡體   English   中英

socket.io發出數據將斷開客戶端連接

[英]socket.io emit data will disconnect the client

我正在聊天,我發現有時在服務器發出一些數據后,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!”}); 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!

經過一番挖掘,看來問題出在socket.io如何將多個消息組合到一個數據包中。

兩個問題( #65 #83 )描述了當前的問題,並進一步詳細討論了該問題。

總之,socket.IO-objc庫不處理這些特殊情況,並始終假定數據包僅包含一條消息。

供參考的第65期:

服務器每隔一段時間(在套接字通信繁忙期間)可以決定發送有效負載,在單個輪詢響應中返回多個數據包的情況下(例如,如果使用xhr-polling)。 它們由\\ ufffd字符分隔,並包括每個數據包的字節長度,例如:

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

長度]。[packet_n]

目前,我相信onData只能將數據作為單個數據包處理,但是在某些情況下,服務器會在單個響應中發送多個數據包。

注意 是\�字符。

修補程序已提交較早,在發布時看來正在接受審查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM