NodeMCU HTTP服务器停止响应
2016-5-2 17:42:17
收藏:0
阅读:86
评论:1
我正在尝试用NodeMCU制作一个简单的HTTP服务器。我启动NodeMCU,然后连接到WiFi,然后运行下面的程序。我可以从浏览器连接到服务器。如果我一直重载页面,它可以一直工作,但是如果停止发送请求一两分钟,服务器将会停止工作。这意味着,当我重新加载页面时,NodeMCU不会收到任何数据(也无法返回任何数据)。
a=0
function receive(conn,payload)
a=a+1
print(payload)
local content="<!DOCTYPE html><html><head><link rel='shortcut icon' href='/'></head><body><h1>Hello!</h1><p>自服务器启动以来,已进行了" .. a .. "个连接</p></body></html>"
local contentLength=string.len(content)
conn:send("HTTP/1.1 200 OK\r\nContent-Length:" .. contentLength .. "\r\n\r\n" .. content)
conn:close()
end
function connection(conn)
conn:on("receive",receive)
end
srv=net.createServer(net.TCP,1)
srv:listen(8080,connection)
我做了一些事情:
- 我停止了浏览器通过添加到无处链接的favicon请求。
- 我将空闲客户端的超时时间设置为1,以防止浏览器长时间加载(浏览器会一直加载直到超时)。
- 我更新了代码以发送一些HTTP头。
- 我尝试在每次连接后关闭和打开服务器(无益,因为即使没有这个修复措施,如果你一直做连接,它也不会停止工作)。
- 我像StackOverflow上的一个答案建议的那样添加了
conn:close()。
我正在运行预编译的固件0.9.6-dev_20150704整数。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
首先,你不应该使用那些旧的 0.9.x 二进制文件。它们已不再受支持,并且存在很多错误。从
dev(1.5.1) 或master(1.4) 分支中构建自定义固件:http://nodemcu.readthedocs.io/en/dev/en/build/。SDK 版本 >1.0(如果你从当前分支构建,则会得到此版本)中,
conn:send是完全异步的,即你不能连续多次调用它。此外,你不能在conn:send()后立即调用conn:close(),因为在send()完成之前套接字可能会被关闭。相反,你可以在其回调中监听sent事件并关闭套接字。如果你考虑到了这点,你的代码在更新的固件上可以正常工作。针对异步发送的更优雅的方法已经在 NodeMCU API 文档 的
socket:send()中记录。然而,该方法使用了更多的堆,对于像你这样数据较少的简单情况并不是必需的。所以,这里是一个使用
on("sent")的完整示例。请注意,我将 favicon 改为了外部资源。如果你使用 "/",浏览器仍会针对你的 ESP8266 发出额外的请求。a = 0 function receive(conn, payload) print(payload) a = a + 1 local content="<!DOCTYPE html><html><head><link rel='icon' type='image/png' href='http://nodemcu.com/favicon.png' /></head><body><h1>Hello!</h1><p>Since the start of the server " .. a .. " connections were made</p></body></html>" local contentLength=string.len(content) conn:on("sent", function(sck) sck:close() end) conn:send("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:" .. contentLength .. "\r\n\r\n" .. content) end function connection(conn) conn:on("receive", receive) end srv=net.createServer(net.TCP, 1) srv:listen(8080, connection)