lua实现http的异步回调

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

测试环境

  • lua 5.1

同步

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

lua 复制代码
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();

输出结果:

lua 复制代码
F:\study\lua\fragmentary> lua "f:\study\lua\fragmentary\socket\client.lua"
code =  200

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

异步

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

lua 复制代码
    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 do
        local chunk, status, partial = con:receive(1024)
        response = response .. (chunk or partial)
        print("status = ", status);
        if status == "closed" then
            break;
        end
    end

输出:

复制代码
status =        nil
status =        nil
status =        closed

小结:

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

参考

1\][socket.http](https://lunarmodules.github.io/luasocket/http.html) \[2\][Non-Preemptive Multithreading](https://www.lua.org/pil/9.4.html)

相关推荐
古城小栈5 小时前
封神!Rust 出品 HTTP 压测神器 cargo-whero,轻量碾压 JMeter、wrk,新手也能秒上手
jmeter·http·rust
从零开始学习人工智能11 小时前
同文件同网络,curl 上传飞快,浏览器 HTTP/1.1 却慢到离谱?终于找到元凶!
网络·网络协议·http
程序员小白条11 小时前
别盲目卷算法!2026 程序员\&大学生,最稳的 AI 技术进阶路线全梳理
java·网络·人工智能·网络协议·http·面试
minji...15 小时前
Linux 网络基础(二)HTTP协议,域名,URL,URI,认识HTTP的请求和响应
linux·服务器·网络·网络协议·http·tcp
minji...15 小时前
Linux 网络套接字编程(八)自定义实现 HTTP 服务器,HTTP 的工作模式
linux·服务器·网络·http·udp·tcp
qq_三哥啊1 天前
【mitmproxy】通过 mitmproxy 的HTTP代理模式获取 OpenCode 发起的 AI API 请求的详细信息
网络·http·代理模式
孙同学_1 天前
一文带你了解:从浏览器发起HTTP请求到得到网页的整个过程
网络·网络协议·http
想唱rap2 天前
应用层HTTPS协议
服务器·网络·c++·网络协议·http·https
05候补工程师2 天前
【408 应用层通关】DNS 域名解析负载博弈、HTTP 延迟计算与邮件协议全家桶详解
网络·经验分享·笔记·网络协议·计算机网络·http
qq_589568102 天前
springbootweb案例,出现访问 http://localhost:8080/list 一直处于浏览器运转阶段
java·网络协议·http·list·springboot