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