lua socket handling multiple connections
我的问题是关于lua套接字的,说我有一个聊天室,并且我想为该聊天室制作一个机器人。但是聊天在不同的服务器上都有多个聊天室,这些聊天室是由称为getServer的函数计算的
连接函数看起来像这样
1 2 3 4 5 6
| function connect(room)
con = socket.tcp()
con:connect(getServer(room), port)
con:settimeout(0)
con:setoption('keepalive', true)
con:send('auth' .. room) |
及其循环功能将是
1 2 3 4 5 6 7 8 9 10 11
| 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 |
现在,所有运行时它仅从第一个房间接收数据,我不知道如何解决该问题
- 在每个房间的调用connect()的地方显示代码,而主要的不显示片段。并修复不良缩进。
-
我将其链接到github存储库,因为文件很大;(链接Github [link]只需添加socket.select(),这几乎就是我得到的
-
这不是我的意思。显示调用connect(room)的代码和调用main()的代码。您附加的链接均不包含这些链接。
-
对不起,main()函数是ch_handler函数,connect在ch_init内部被调用,而ch_init函数在example.lua中被调用,这里链接example.lua
-
您需要创建一个SSSCE。代码过多。也许con是在ch_connect中全局设置,然后在ch_handler中使用的,但是每个连接都会用最新的连接覆盖引用?
-
然后,如果它覆盖了如何修复它,如果是python,我只是将连接指向房间名称的字典,然后使getCons函数返回键和值列表,那么我将创建一个读者和作家列表将其传递给选择,然后遍历读取列表
尝试创建连接数组。将房间映射为连接也可能很有用。示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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是已找到项目的连接的数组,其中有待读取的数据。因此,在for i,con循环中,con是连接对象,请勿使用connections[con](这没有意义,因为连接是数组而不是映射)。
- 我已经尝试过了,首先它说尝试调用一个表值,所以我做了for con in ipairs(rect) do,它实际上并没有连接到房间
-
for con in ipairs(rect) do resp, err, part = connection[con]:receive('*l')并不完全是我使用您的代码运行时它连接到房间但没有接收到数据的原因,for con in ipairs(rect) do resp, err, part = connection[con]:receive('*l')是因为据我了解。 socket.select()使用一个数组,该数组保存每个连接,选择作业是等待接收数据,然后将该连接输出为数字,例如,连接保存两个连接r1,r2。当r1接收数据时,con值为1,当r2接收数据时,con值为2,对吗?但是,当确实获取数据时,它会输出一个错误。
-
表示attempt to index field '?' (a nil value),并且该错误来自receive()
-
@ user3103366那是因为我在代码中存在几个错误。看看这是否更好。您注释中的代码缺少我在更新后的答案中输入的i,并解释了为什么不使用connection[con]。注意我使用的是connections而不是connection,因为它是一个数组。希望它现在可以工作。
-
非常感谢,它现在可以正常工作。有趣的是,我以前曾经尝试过for循环,但是我忘了使用ipairs而不是pairs,这个问题已经解决了
-
太好了。不要忘了赞扬任何有用的答案(针对您阅读的所有问题,而不仅仅是您自己的问题)。