我需要一个客户端和服务器通过套接字进行通信。客户端告诉服务器它想要一个特定的消息(通过字符串“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机器,不知道这是否有用。
答案 0 :(得分:0)
当我放入一段时间时,服务器显然发送消息但它永远不会到达客户端,除非我关闭客户端正在运行的终端窗口
我不知道这意味着什么。关闭终端窗口应关闭客户端,这几乎不意味着它会突然收到消息。
然而,这有很多问题,评论时间太长了:
sockname
检查毫无意义。它不会失败。答案 1 :(得分:0)
问题在于
data, errormsg = client:receive("*a")
在客户端代码中排队。选项* a仅在连接关闭时接收并将其更改为* l或者下面没有任何内容使其正常工作。
data, errormsg = client:receive()