2017-02-24 112 views
2

问题LuaSocket服务器:接受()超时(TCP)

LuaSocketIntroduction我设法让服务器运行。我也设法从客户端连接。不过,我注意到,服务器脚本冻结,直到server:accept()获得连接。

研究

LuaSocketReference规定:

使用的setTimeout方法或接受可能被阻塞,直到另一个客户端显示出来。

这甚至包括在示例代码中。但是,在local client = server:accept()之后调用client:settimeout(10),因此脚本在达到此点之前会被阻止。

我读过这可以通过多线程解决,但这似乎是一个夸大。

问题

  1. 你如何导致服务器脚本停止等待连接,继续前进?
  2. 如何防范client:receive()(服务器端)和tcp:receive()(客户端)(或client:settimeout(10)负责)类似的问题?

代码

服务器(从LuaSocketIntroduction

-- load namespace 
local socket = require("socket") 
-- create a TCP socket and bind it to the local host, at any port 
local server = assert(socket.bind("*", 0)) 
-- find out which port the OS chose for us 
local ip, port = server:getsockname() 
-- print a message informing what's up 
print("Please telnet to localhost on port " .. port) 
print("After connecting, you have 10s to enter a line to be echoed") 
-- loop forever waiting for clients 
while 1 do 
    -- wait for a connection from any client 
    local client = server:accept() 
    -- make sure we don't block waiting for this client's line 
    client:settimeout(10) 
    -- receive the line 
    local line, err = client:receive() 
    -- if there was no error, send it back to the client 
    if not err then client:send(line .. "\n") end 
    -- done with client, close the object 
    client:close() 
end 

客户端(如下this answer

local host, port = "127.0.0.1", 100 
local socket = require("socket") 
local tcp = assert(socket.tcp()) 

tcp:connect(host, port); 
--note the newline below 
tcp:send("hello world\n"); 

while true do 
    local s, status, partial = tcp:receive() 
    print(s or partial) 
    if status == "closed" then break end 
end 
tcp:close() 

回答

1

你应该能够调用前使用:

server:settimeout(2) 
local client, err = server:accept() 
print(client, err) 

这将打印nil timeout对我来说,如果没有请求到达2秒。