处理多个连接的lua套接字

处理多个连接的lua套接字,lua,luasocket,Lua,Luasocket,我的问题是关于LuaSockets,假设我有一个聊天,我想为这个聊天做一个机器人。但是聊天室在不同的服务器上有多个聊天室,这些聊天室是由一个名为getServer connect函数如下所示 function connect(room) con = socket.tcp() con:connect(getServer(room), port) con:settimeout(0) con:setoption('keepalive', true) con:send('a

我的问题是关于LuaSockets,假设我有一个聊天,我想为这个聊天做一个机器人。但是聊天室在不同的服务器上有多个聊天室,这些聊天室是由一个名为
getServer
connect函数如下所示

function connect(room)
   con = socket.tcp()
   con:connect(getServer(room), port)
   con:settimeout(0)
   con:setoption('keepalive', true)
   con:send('auth' .. room)
循环它的函数是

function main()
   while true do
     rect, r, st = socket.select({con}, nil, 0.2)
     if (rect[con] ~= nil) then
        resp, err, part = con:receive("*l")
        if not( resp == nil) then
            self.events(resp)
 end
    end
       end
          end

现在,当所有这些运行时,它只接收来自第一个房间的数据,我不知道如何解决这个问题,请尝试创建一个连接数组。房间到连接的地图也可能有用。例如:

local connections = {}
local roomConnMap = {}

function connect(room)
   local con = socket.tcp()
   con:connect(getServer(room), port)
   con:settimeout(0)
   con:setoption('keepalive', true)
   con:send('auth' .. room)

   table.insert(connections, con)
   roomConnMap[room] = con
end

function main()
   while true do
     local rect, r, st = socket.select(connections, nil, 0.2)
     for i, con in ipairs(rect) do 
        resp, err, part = con:receive("*l")
        if resp ~= nil then
            self.events(resp)
        end
     end
   end
end

请注意,
rect
是一个项目数组,其中包含要读取的数据。因此,在i,con的
循环中,con是连接对象,不要使用
连接[con]
(这没有意义,因为连接是一个数组,而不是一个映射)

显示为每个房间调用connect()的代码,以及main,不显示片段。我将把它链接到github repo,因为文件太大了;([link]只需添加socket.select(),这正是我得到的。这不是我的意思。显示调用
connect(room)
的代码和调用
main()
的代码。您附加的链接不包含这两个。对不起,
main()
函数是
Chu handler
函数,在
Chu init
内部调用connect,在example.lua中调用
Chu init
函数,这里您需要创建一个.太多的代码。可能con是Chu connect中的一个全局集,然后在Chu handler中使用,但每个连接都会覆盖引用使用最新连接?我已经尝试过了,首先它说尝试调用一个表值,所以我对ipairs(rect)中的con做了
,它从来没有实际连接到房间。不完全是在我使用代码运行时,它连接到房间但没有接收到数据,然后我做了,
对于ipairs(rect)中的con做了响应,错误,部分=连接[con]:接收('*l')
因为据我所知。
socket.select()
使用一个数组,该数组保存每个连接,选择job is wait to receive data,然后以数字形式输出该连接,例如,连接保存两个连接r1、r2。当r1接收数据时,con值为1,当r2接收数据时,con值为2,对吗?但当它确实获取数据时,会输出一个错误。即,
尝试索引字段“?”(一个空值)
而该错误来自
receive()
@user3103366,这是因为我输入的代码中有几个错误。看看这是否更好。您注释中的代码缺少一个
I
,我在更新的答案中输入了该错误,并解释为什么不使用
连接[con]
。注意,我使用了
连接
而不是
连接
,因为它是一个数组。希望它现在可以工作。非常感谢,它现在可以工作了。有趣的是,我以前曾经尝试过这样的for循环,但我忘记使用ipairs而不是pairs。这个问题已经解决了