我的ESP-12上运行了一个带有nodemcu固件的小型Web服务器:
sv=net.createServer(net.TCP,10)
sv:listen(80,function(c)
c:on("receive", function(c, pl)
if(string.find(pl,"GET / ")) then
print("Asking for index")
c:send("Line 1")
c:send("Line 2")
c:send("Line 3")
c:close()
end
end)
c:on("sent",function(conn)
print("sended something...")
end)
end)
似乎我的连接在第一次发送后关闭,在我的浏览器中我只看到"第1行"文本,第2行a 3没有出现,并且在我的串行控制台中,我只是看到"发送的东西"文本一次,甚至注释close语句并让连接超时不会改变行为。我在这里缺少什么?
答案 0 :(得分:1)
我认为您不能多次使用发送。每当我使用我的一个ESP8266作为服务器时,我都使用缓冲变量:
sv=net.createServer(net.TCP,10)
-- 'c' -> connection, 'pl' -> payload
sv:listen(80,function(c)
c:on("receive", function(c, pl)
if(string.find(pl,"GET / ")) then
print("Asking for index")
local buffer = ""
buffer = buffer.."Line 1"
buffer = buffer.."Line 2"
buffer = buffer.."Line 3"
c:send(buffer)
c:close()
end
end)
c:on("sent",function(c)
print("sended something...")
end)
end)
编辑:再次阅读文档后,send
可以使用回调函数获取另一个参数,它可以用于具有多个发送命令。从来没有尝试过:(。
编辑2:如果您要发送一个非常长的字符串,最好使用table.concat
答案 1 :(得分:1)
net.socket:send()文档提供了一个很好的例子,我在这里重复一遍。
srv = net.createServer(net.TCP)
function receiver(sck, data)
local response = {}
-- if you're sending back HTML over HTTP you'll want something like this instead
-- local response = {"HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nContent-Type: text/html\r\n\r\n"}
response[#response + 1] = "lots of data"
response[#response + 1] = "even more data"
response[#response + 1] = "e.g. content read from a file"
-- sends and removes the first element from the 'response' table
local function send(localSocket)
if #response > 0 then
localSocket:send(table.remove(response, 1))
else
localSocket:close()
response = nil
end
end
-- triggers the send() function again once the first chunk of data was sent
sck:on("sent", send)
send(sck)
end
srv:listen(80, function(conn)
conn:on("receive", receiver)
end)