2016-02-15 54 views
1

我一直在使用套接字tcp连接到游戏服务器。这里最大的问题在于游戏服务器没有任何分隔符发送数据 - 因为它将数据包长度发送到数据中 - 使得无法使用socket:receive(“* a”)或“* l”。从服务器收到的数据不具有静态大小,并以HEX格式发送。我使用此解决方案:从lua tcp socket接收没有数据大小的数据

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 

正如你看到的,我只能通过读取一个字节并将其附加到一个字符串,而不是一个很好的方式得到从插座中的所有数据,因为我有两个套接字读。有没有更好的方式从这个套接字接收数据?

回答

2

我不认为有任何其他的选择;通常在这种情况下,客户端会读取特定长度的数据包,以确定需要从数据流的其余部分读取多少数据。有些协议结合了新线和长度;例如HTTP使用行分隔符作为标题,其中一个标题指定了标题之后的内容长度。

尽管如此,您不需要逐一读取流,因为您可以切换到非阻塞式读取并请求任意数量的字符。如果没有足够的读数,你会得到部分读取的内容加上“超时”信号,你可以在你的逻辑中处理;从documentation

在错误的情况下,所述方法返回nil,随后的错误消息 其可以是字符串的情况下,“封闭”的连接关闭 完成传输之前或字符串“超时'如果 在操作过程中发生超时。此外,在错误 消息之后,该函数返回传输的部分结果。

+0

谢谢!我对settimeout很困惑,看起来延迟不能低于0.3 – Eshkation