从lua tcp套接字接收没有数据大小的数据

我一直在使用tcp套接字连接游戏服务器。这里的大问题是游戏服务器发送没有分隔符的数据-因为它在数据内发送了数据包长度-所以无法使用socket:receive("*a")或"*l"。从服务器接收到的数据没有静态大小并且以HEX格式发送。我正在使用此解决方案:

while true do
    local rect, r, st = socket.select({_S.sockets.main, _S.sockets.bulle}, nil, 0.2)
    for i, con in ipairs(rect) do
        resp, err, part = con:receive(1)
        if resp ~= nil then
            dataRecv = dataRecv..resp
        end
    end
end

正如您所见,我只能读取一个字节并将其附加到字符串中,才能从套接字中获取所有数据,而这不是一个好的方法,因为我有两个套接字要读取。 从此套接字接收数据有更好的方法吗?

点赞
用户1442917
用户1442917

我认为没有其他选择;通常在这种情况下,客户端读取特定长度的数据包来确定需要从其余的流中读取多少。有些协议将换行符和长度结合在一起;例如,HTTP使用线路分隔符作为标头,其中一个标头指定了跟随标头的内容的长度。

尽管如此,您不需要一次一个字符地读取流,因为您可以切换到非阻塞读取并请求任意数量的字符。如果没有足够的数据可读取,您将获得部分读取的内容加上“超时”信号,您可以在逻辑中进行处理;从 文档 中了解到:

在发生错误的情况下,该方法返回 nil,后跟一个错误消息,该错误消息可以是字符串“closed”,表示连接在传输完成前已关闭,或字符串“timeout”,表示操作期间发生超时。此外,在错误消息之后,该函数返回传输的部分结果。

2016-02-15 17:07:15