Sockets 使用loop多次接收和发送消息时,Lua TCP服务器出现问题

Sockets 使用loop多次接收和发送消息时,Lua TCP服务器出现问题,sockets,tcp,lua,server,luasocket,Sockets,Tcp,Lua,Server,Luasocket,我需要一个客户端和服务器通过套接字进行通信。客户机告诉服务器它需要一条特定的消息(通过字符串“arquivo”),并获取应该是10KB长的消息。它们都必须保持连接的打开状态,以防客户端想要再次使用相同的字符串请求消息。我可以为1个exchange实现这一点,关闭连接。但是,当我放入一段时间后,服务器显然会发送消息,但它永远不会到达客户端,除非我关闭客户端正在运行的终端窗口。我在一个单独的终端窗口中运行每一个,并使用一个服务器测试客户端代码,该服务器只发送一次消息,然后关闭连接,消息就通过了。有问

我需要一个客户端和服务器通过套接字进行通信。客户机告诉服务器它需要一条特定的消息(通过字符串“arquivo”),并获取应该是10KB长的消息。它们都必须保持连接的打开状态,以防客户端想要再次使用相同的字符串请求消息。我可以为1个exchange实现这一点,关闭连接。但是,当我放入一段时间后,服务器显然会发送消息,但它永远不会到达客户端,除非我关闭客户端正在运行的终端窗口。我在一个单独的终端窗口中运行每一个,并使用一个服务器测试客户端代码,该服务器只发送一次消息,然后关闭连接,消息就通过了。有问题的服务器代码如下所示:

filename = "file10KB.txt"
file = assert(io.open(filename, "r"))
msg = file:read("*a")
file:close()

socket = require("socket")

host = "*"
port =  8080

print("Binding to host '" .. host .. "' and port " .. port .. "...")

server = assert(socket.bind(host, port))
server:setoption("reuseaddr", true)
ipaddress, socketport = server:getsockname()
assert(ipaddress, socketport)

print("Waiting connection from client on " .. ipaddress .. ":" .. socketport .. "...")

connection = assert(server:accept())
connection:setoption("keepalive", true)
connection:settimeout(10)

print("Connected!")

while true do
    print("Waiting for request...")
    data, errormsg = connection:receive()

    if data == "arquivo" then
        print("Proper request received, sending message...")
        assert(connection:send(msg .. "\n"))
        print("Message sent!")
    elseif not errormsg then
        print("Invalid request.")
        break
    else
        print("Error message: " .. errormsg)
        break
    end
end
此外,我的客户代码:

socket = require("socket")

host = "localhost"
port = 8080

print("Attempting connection to server '" .. host .. "' and port " .. port .. "...")

client = assert(socket.connect(host, port))

client:setoption("keepalive", true)
client:setoption("reuseaddr", true)
client:settimeout(10)

print("Connected!")

repeat
    print("Sending message request...")
    assert(client:send("arquivo" .. "\n"))

    print("Message request sent! Waiting for message...")
    data, errormsg = client:receive("*a")

    if data then
        print("Message received!")
        print(data)
    else
        print("Failed to receive message.")
        break
    end
until not client
我对Lua和sockets都是新手,我在网上找到了一些教程,比如(葡萄牙语)。我只希望你们中的任何人都能让我明白我错过了什么。顺便说一下,我正在使用MacOSX机器,不知道这是否有用

但是,当我放入一段时间后,服务器显然会发送消息,但它永远不会到达客户端,除非我关闭客户端正在运行的终端窗口

我不知道这是什么意思。关闭终端窗口应该关闭客户端,这并不意味着它会突然收到消息

但是,这方面存在许多问题,评论太长:

  • 您需要在绑定之前设置SO_REUSEADDR。后来太晚了
  • 您根本不需要在客户端设置它,但如果这样做,则必须在连接之前设置
  • 服务器中的
    sockname
    检查没有意义。它不会失败的
  • 您的服务器只接受一个连接
  • 您的服务器从不关闭连接
  • 您的服务器似乎无法正确识别流的结尾
  • 您的客户端从不关闭连接

    • 问题出在

      data, errormsg = client:receive("*a")
      
      客户端代码中的行。选项*a仅在连接关闭时接收,并将其更改为*l或以下类似选项使其正常工作

      data, errormsg = client:receive()
      

      谢谢你的评论,我会改正的。我还想知道我的问题是什么,回答下面的问题。再次感谢!