我一直在閱讀NodeMCU文檔以及有關SDK的更改的幾個封閉問題,這些問題以前可以發送多個數據流排隊的net.socket:發送)。如何使用新的SDK(NodeMCU)發送多個數據(conn:send())
這裏似乎有一個巨大的爭論(#730)和那裏(#993)甚至在這裏(#999)。然而,我沒有找到一個令人信服的web服務器代碼示例,它允許我讀取多個html文件(例如head.html
和body.html
)以顯示頁面。下面是從TerryE的例子中,我試圖去適應,但沒有成功:
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
conn:on ("receive", function(sck, req)
local response = {}
local f = file.open("head.html","r")
if f ~= nil then
response[#response+1] = file.read()
file.close()
end
local f = file.open("body.html","r")
if f ~= nil then
response[#response+1] = file.read()
file.close()
end
local function sender (sck)
if #response>0 then sck:send(table.remove(response,1))
else sck:close()
end
end
sck:on("sent", sender)
sender(sck)
end)
end)
當連接到ESP8266,沒有加載和我從LUA終端沒有錯誤。
爲了您的信息,head.html
包含:
<html>
<head>
</head>
而且body.html
包含:
<body>
<h1>Hello World</h1>
</body>
</html>
我是很新的NodeMCU,請寬容。
特里的最初的例子的美妙之處在於它與一個隱含的循環回調,如你所述。它從表中取出一塊(請不要稱爲數組),發送它並在發送回調時再次調用發送方以發送下一個表,直到表爲空。您的代碼唯一的主要問題是,無論實際內容如何,您都會發送相同的HTTP標頭。在'file == nil'的情況下,你的頭文件應該報告HTTP 404而不是HTTP 200.因此,而不是在第5行添加'header',你應該在if/else內有條件地做。 –
另外,http://lua-users.org/wiki/LuaStyleGuide-> Lua Idioms,你可以使用'if then then'來代替'if if〜then then'。就我個人而言,我從來不會調用變量'f',因爲我喜歡錶達性的名字,但這是一個風格問題。 –
我的主要附錄是值得Lua的額外幾十行在響應數組中查看並計算最大espconn緩衝區大小中的多少個數,然後將前N個緩衝區編組爲單個發送數據,例如, 'SCK:發送(table.concat({解包(響應,1,N)}))'。這可能看起來很笨重,但是大部分這個clunk都是在直接從C編譯的代碼中執行的,因此運行效率非常高,並且提供了很好的數據包大小。 – TerryE