socket.io 发出数据将断开客户端

Posted

技术标签:

【中文标题】socket.io 发出数据将断开客户端【英文标题】:socket.io emit data will disconnect the client 【发布时间】:2013-03-03 11:02:30 【问题描述】:

我正在聊天,我注意到有时我的 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('连接',函数(socket) socket.emit("message", "text":"welcome2!"); socket.emit("message", "text":"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"];

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!

【问题讨论】:

你的字符串中有坏数据吗? 不,它们是正常数据.. 显示节点和客户端的代码。 我已经编辑了我的问题。希望有帮助 是的。仅发生在 iOS 上。使用 socket.IO-objc 库。我已经更新了我的问题。 【参考方案1】:

经过一番挖掘,问题似乎归结为 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 只是处理数据 作为单个数据包,但在某些情况下,服务器会发送多个 单个响应中的数据包。

注意 � 是 \ufffd 字符。

之前有一个fix has been submitted,截至发帖时似乎正在审核中。

【讨论】:

以上是关于socket.io 发出数据将断开客户端的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 服务器在注册客户端断开连接时非常延迟

socket.io 在空闲时断开客户端的连接

nodejs socket 怎么检测客户端主动断开连接

Socket.io 不断向每个客户端发出请求的数据

在 NestJS 中连接后,Socket.io 客户端正在断开连接

使用 Socket.io 检测(客户端)连接断开