关于lua:LuaSocket服务器:accept()超时(TCP)

LuaSocket server:accept() timeout (TCP)

问题

按照LuaSocket的介绍,我设法使服务器运行。 我还设法从客户端连接。 但是,我注意到服务器脚本冻结,直到server:accept()获得连接。

研究

LuaSocket参考指定:

Use the settimeout method or accept might block until another client shows up.

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

我读到可以通过多线程解决此问题,但这似乎有点夸张。

问题

  • 如何使服务器脚本停止等待连接并继续前进?
  • 如何避免client:receive()(服务器端)和tcp:receive()(客户端)(或client:settimeout(10)负责)的类似问题?
  • 服务器(来自LuaSocket简介)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    -- 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 .."\
    "
    ) end
      -- done with client, close the object
      client:close()
    end

    客户(遵循此答案)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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\
    "
    );

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

    您应该能够在调用server:accept()之前使用server:timeout():

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

    如果2秒钟内没有请求,这将为我打印nil timeout