NodeMCU网页服务器在第一次发送后关闭连接?

我在 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)

似乎在第一次发送后我的连接就被关闭了,在我的浏览器中我只看到了“Line 1”文本,而第二和第三行没有出现,并且在我的串行控制台中我只看到了一次“sended something”文本,即使注释掉关闭语句并让连接超时也不会改变这种行为。我在这里缺少了什么?

点赞
用户922975
用户922975

我认为你不能多次使用send函数。每当我使用我的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("正在请求索引")
            local buffer = ""
            buffer = buffer.."第1行"
            buffer = buffer.."第2行"
            buffer = buffer.."第3行"
            c:send(buffer)
            c:close()
        end

    end)
    c:on("sent",function(c)
        print("已发送...")
    end)
end)

编辑:再次阅读文档后,send函数可以使用另一个参数及其回调函数,可能可用于多个send指令。不过我从未尝试过:(。

编辑2:如果您有非常长的字符串要发送,最好使用table.concat

2015-11-22 06:58:20
用户131929
用户131929

net.socket:send()文档提供了一个很好的例子,我在这里重复一下。

srv = net.createServer(net.TCP)

function receiver(sck, data)
  local response = {}

  -- 如果你发送的是HTML,你需要像这样更改
  -- local response = {"HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nContent-Type: text/html\r\n\r\n"}

  response[#response + 1] = "大量的数据"
  response[#response + 1] = "更多的数据"
  response[#response + 1] = "例如从文件读取的内容"

  -- 发送并从'response'表中删除第一个元素
  local function send(localSocket)
    if #response > 0 then
      localSocket:send(table.remove(response, 1))
    else
      localSocket:close()
      response = nil
    end
  end

  -- 一旦第一批数据被发送,就再次触发send()函数。
  sck:on("sent", send)

  send(sck)
end

srv:listen(80, function(conn)
  conn:on("receive", receiver)
end)
2017-02-12 20:53:49