我正在开发一个使用套接字与外界通信的小型 Lua 应用程序(在 Lua for Windows 下,如果这很重要)。(LuaSocket)
我正在尝试同时提出几个请求。所以我认为 LuaLanes 是要走的路。(当然,如果有更好的解决方案,我愿意接受替代方案,但不希望为此处理协程。)
像这样的东西:
server = assert (socket.bind ('*', 1234))
client = server : accept ()
-- set id to some unique value
allClients [id] = client
theLane = lanes.gen ("", laneTest) ( id )
print (theLane [1])
其中laneTest
函数定义如下:
function laneTest (id)
local client = allClients [id]
print ('peer: ', client:getpeername())
end
我的问题是,在laneTest
函数内部,当作为车道运行时,我收到这个可爱的错误消息:
尝试索引本地“客户端”(用户数据值)
(从线client:getpeername()
)
所以..我不确定这里发生了什么?通道与套接字不兼容,还是我做错了什么?
我想这可能是 Lua for Windows 附带的通道版本是古老的(luaforwindows)并且不适用于套接字,但最新版本可能?(车道 2.0.4 与更新的 3.xx)
我真的不知道如何更新我拥有的 Lanes 版本,否则我现在已经尝试过了,所以。如果那是我可能要去的地方,或者有更明显的事情表明我做错了,我将不胜感激。
编辑:我继续通过 luarocks 安装了车道,并且使用安装为岩石的车道 3.1.6-1 遇到了同样的问题。
编辑2:试过这个(但仍然失败):
require ('socket')
require ('lanes')
local allClients = {}
function theLane (id)
print ('the id:', id) -- correctly prints out the id passed to the function
local SOCKET = require ('socket')
local client = allClients [id]
print ('peer:', client:getpeername())
client : close ()
end
local server = assert (SOCKET.bind ('*', 1234))
local ip, port = server:getsockname ()
local laneFunc = lanes.gen('', theLane)
local client = server:accept ()
allClients [1] = client
local x = laneFunc (1)
print (x[1])
- 这未能声称:
attempt to call global 'require' (a nil value)
- 删除
require ('socket')
函数内的行并重试也失败说:attempt to index local 'client' (a userdata value)
我为错过明显的事情提前道歉,但是......你如何让套接字与车道一起工作?
编辑3:
好吧,我正在编辑它以供将来参考:)
据我所知,没有修补luasockets就无法使用带有套接字的通道。有关更多信息,请参见此处的讨论;但简而言之(正如德科的回答中所解释的那样):车道不适用于用户数据。luasocket 不提供任何其他访问套接字/套接字信息的方式。
我不想修补 luasocket,就像我宁愿使用车道一样,我会继续坚持使用 copas 或 couroutines。
谢谢大家!