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

时间:2016-03-29 23:05:40

标签: sockets tcp lua server luasocket

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

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和套接字的新手,我按照我在网上找到的一些教程,例如http://www.portugal-a-programar.pt/topic/36175-aprendendo-a-usar-lua-socket/(用葡萄牙语)。我希望你们中的任何一个人都可以了解我所缺少的东西。我顺便使用Mac OS X机器,不知道这是否有用。

2 个答案:

答案 0 :(得分:0)

  

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

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

然而,这有很多问题,评论时间太长了:

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

答案 1 :(得分:0)

问题在于

data, errormsg = client:receive("*a")

在客户端代码中排队。选项* a仅在连接关闭时接收并将其更改为* l或者下面没有任何内容使其正常工作。

data, errormsg = client:receive()