Closed fanyh closed 4 years ago
被分包是一个比较常态的问题(包体过大); 我认为应该在网络层处理buf粘连 业务层只需要知晓 read到的buf是否合法,然后处理对应逻辑即可 这样对于逻辑和网络层切割会更加干净一些 ps:我尝试在业务层实现了分包粘连,阅读起来始终觉得怪怪的。实现了几种方案,也就如下这种看上去比较合理 exp:
local function readbuf(socket, length)
local reply = ""
while #reply < length do
local ret,err = sock:recv(length - #reply)
if not ret then
return nil,err
end
reply = reply .. ret
end
return reply
end
local function get_reply(sock, result)
local length = driver.length(sock:recv(4))
local reply = readbuf(sock, length)
return reply, driver.reply(reply, result)
end
这种方式也只有在业务层里面做个sock:recv 的swap 其他逻辑中如果需要处理分包又需要实现一次util_recv 是否采用这种方式来实现呢?
可以把readbuf这个方法放到socket_util.lua,命名叫read_full。怎么样?
这样没问题,即没破坏socket的接口制定,也完成了封装,我修改完你看看
我觉得没必要在socket上until_recv方法; 在使用的地方多调用几次recv就可以了。 socket接口是参考python的接口制定的;