我一直在与游戏服务器的套接字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
正如您所看到的,我只能通过读取一个字节并将其附加到字符串来获取套接字中的所有数据,这不是一个好方法,因为我有两个套接字要读取。有没有更好的方法从这个套接字接收数据?
答案 0 :(得分:2)
我认为还有其他选择;通常在这种情况下,客户端会读取特定长度的数据包,以确定需要从流的其余部分读取多少数据包。一些协议结合了新的线和长度;例如,HTTP使用标题的行分隔符,其中一个标题指定标题后面的内容的长度。
但是,您不需要逐个读取流,因为您可以切换到非阻塞读取并请求任意数量的字符。如果没有足够的内容阅读,您将获得部分阅读内容以及"超时"发出信号,您可以在逻辑中处理;来自documentation:
如果出现错误,该方法返回nil,然后返回错误消息 这可以是字符串'关闭'以防连接关闭 在传输完成之前或字符串超时'如果 操作期间有一个超时。此外,错误后 消息,该函数返回传输的部分结果。