我正在为OBS编写一个Lua脚本,它不断通过TCP连接从ProPresenter(另一个程序)接收数据。我使用LuaSocket库进行连接,并按预期获取数据。
问题是,当我关闭ProPresenter时,我无法让我的脚本注册连接已关闭,而我将luasocket超时设置为0(因为它是非阻塞连接)。我需要脚本始终是非阻塞的,否则它将导致所有OBS停止并且帧速率降至1以下...
但是,如果我将超时设置为例如。 1秒钟,luasocket注册表示连接没有问题,并且根据this示例,当超时为0时它应该工作。但显然它没有,我怀疑这是因为该示例使用较旧的Luasocket,并且最新版本可能已经改变。
这是我的代码:
不注册连接已关闭duo超时:
function recv_and_process_data()
local data
data, err, partial = s:receive()
if data ~= nil then
--process the recieved data. This part works.
elseif err == "closed" then
--doesn't get here because of timeout...
--inform script that the connection has closed
elseif err == "timeout" then
--goes here as soon as ProPresenter is closed
print(err .. " partial: " .. partial)
end
end
连接关闭时注册,但使OBS停止:
function recv_and_process_data()
local data
s:settimeout(1) --timeout set to 1 second
data, err, partial = s:receive()
s:settimeout(0)
if data ~= nil then
--process the recieved data. This part works.
elseif err == "closed" then
--goes here when ProPresenter is closed
--inform script that the connection has closed
elseif err == "timeout" then
print(err .. " partial: " .. partial)
end
end
这也不起作用(如建议here):
function recv_and_process_data()
local data
data, err, partial = s:receive(0)
if err == "closed" then
print(err .. " partial: " .. partial)
end
end
如果我无法正常工作,我想我必须尝试重新连接以查看ProPresenters服务器是否仍在运行。
我也想弄清楚这个问题。我发现一个非常小的settimeout()值仍然会返回一个你可以使用的错误,但根本不能保存程序。
我用local Data, Error = Client:settimeout(0.0001)