当前位置: 首页 > news >正文

lua实现http的异步回调

想用lua实现与http服务器的通信,请求一些数据会回来,默认lua.socket.http是同步的,所以想弄一个异步的方式

测试环境

  • lua 5.1

同步

以下是同步的代码,其中http.request会被阻塞住的

local function send_request()local res, code, response_headers = http.request("http://www.lua.org/","POST","name=Lua&age=100",{["Content-Type"] = "application/x-www-form-urlencoded"})print("code = ", code)
end
send_request();

输出结果:

F:\study\lua\fragmentary> lua "f:\study\lua\fragmentary\socket\client.lua"
code =  200

如果每次执行一次请求,就卡住我们逻辑的Tick,那整个客户端就卡在那里了。所以,我需要非阻塞的用法。也就是执行请求之后,不用等http服务器返回结果,而是继续向下执行。我主动监听,有返回了,再回调我的逻辑。

异步

参考[2],给出了一定的思路,但是我是看到GPT给的结果,代码都详细列出来了,直呼牛皮啊!

    local host = "www.baidu.com"local path = "";local data = [[name=Lua&age=100]]local port = 80;local con = assert(socket.connect(host, port))self.Conn:settimeout(0)local request = string.format("POST /%s HTTP/1.0\r\nHost: %s\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\n\r\n%s",path, host, #data, data)con:send(request)local response = ""while true dolocal chunk, status, partial = con:receive(1024)response = response .. (chunk or partial)print("status = ", status);if status == "closed" thenbreak;endend

输出:

status =        nil
status =        nil
status =        closed

小结:

  • 1.主要是用tcp连接,用非阻塞的方式去实现
  • 2.自己通过receive接口获取数据

参考

[1]socket.http

[2]Non-Preemptive Multithreading

http://www.lryc.cn/news/128647.html

相关文章:

  • 云服务 Ubuntu 20.04 版本 使用 Nginx 配置SSL证书和nginx从HTTP跳转到HTTPS
  • 隧道代理技术解析:为批量数据采集提供强大支持
  • 小程序制作教程:从零开始搭建企业小程序
  • Redis-秒杀
  • 2022年下半年信息安全工程师下午真题及答案解析
  • 【前端|Javascript第5篇】全网最详细的JS的内置对象文章!
  • Python pycparser(c文件解析)模块使用教程
  • 解决IDEA tomcat控制台只有server日志
  • Java版本+企业电子招投标系统源代码+支持二开+Spring cloud tbms
  • FinalShell SSH工具安装教程及编辑窗口修改背景颜色,自定义背景图片,修改字体,修改快捷键(详细图文教程)
  • uni-app中监听网络状态,并在嵌入webView页面的组件中添加网络监测
  • TP5前后端分离RBAC权限管理API
  • p-级数的上界(Upper bound of p-series)
  • QT如何打包
  • 【c语言】通讯录(动态版+文件+背景音乐)含源码
  • c#后端获实体类多列最大值
  • 腾讯云国际轻量应用服务器使用流程是什么呢?
  • CentOS 8 非编译方式 yum 安装 FFmpeg
  • 【Linux命令详解 | ssh命令】 ssh命令用于远程登录到其他计算机,实现安全的远程管理
  • IP 地址监控工具
  • 基于OpenCV的人脸识别和模型训练系统(万字详解)
  • Docker容器与虚拟化技术:Docker镜像创建、Dockerfile实例
  • 每天一道leetcode:646. 最长数对链(动态规划中等)
  • 651页23万字智慧教育大数据信息化顶层设计及建设方案WORD
  • Vue3 使用json编辑器
  • centos7 docker离线安装教程
  • 解决爬虫上下行传输效率问题的实用指南
  • Vue2入门学习汇总
  • 收支明细高效管理,轻松查看和统计时间段内的开销收支明细!
  • c++ 成绩统计