我有以下代码:
function Server:run()
print("Running.")
self.running = true
while self.running do
if self.client == nil then
self.client = self.socket:accept()
print("Client connected.")
self.client:settimeout(10)
end
local line, err = self.client:receive()
if err then
print("Error: " .. err)
elseif line == "quit" then
print("Quitting.")
self.client:close()
self.running = false
else
print("Received: " .. line)
end
end
self:terminate()
end
我希望当调用self.client:receive()时,服务器将等待10秒或直到它有消息,然后继续前进。
然而,这不是我所经历的行为。无论超时设置为什么值,服务器都会立即生成超时错误,并且不会等待来自客户端的消息。
我怀疑我误会了什么。任何见解都会被贬低。感谢。
完整代码:
答案 0 :(得分:0)
代码按预期适用于我(Windows,LuaJIT 2.0.2,luasocket 3.0-rc1);我测试了以下独立脚本:
local socket = require "socket"
local server = assert(socket.bind("*", 3333))
local client = server:accept()
print("accepted connection; waiting for data...")
client:settimeout(10)
local start = os.time()
local line, err, partial = client:receive("*l")
if line then
print(("received '%s'; echoing back..."):format(line))
client:send(line.."\n")
else
print(("received error '%s' after %.2f seconds."):format(err, os.time()-start))
end
client:close()
您可以运行telnet localhost 3333
,并且应该看到“已接受的连接;等待数据......”;如果我不发送任何内容,我会在10.00秒后收到“收到错误'超时'。”,这正是我所期待的。
我会检查是否存在逻辑错误,并且self.client
在您的情况下永远不会nil
,并且您不会致电settimeout
。如果这仍然无效,请创建一个我们可以使用love2d运行的独立示例(例如,我看不到您在哪里调用bind
)。