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

[2]Non-Preemptive Multithreading

相关推荐
张胤尘4 小时前
Lua | 每日一练 (3)
开发语言·面试·lua
lisanndesu7 小时前
HTTPS
网络协议·http·https
YGGP11 小时前
基于 go-wrk 在 Windows 环境下对 Go Web 应用进行 HTTP 压力测试
http·golang·压力测试
alenliu062111 小时前
跟着 Lua 5.1 官方参考文档学习 Lua (7)
lua
LUCIAZZZ14 小时前
Https解决了Http的哪些问题
java·网络·网络协议·spring·http·rpc·https
一天八小时19 小时前
计算机网络————(一)HTTP讲解
网络协议·计算机网络·http
逻各斯1 天前
redis中的Lua脚本,redis的事务机制
java·redis·lua
哑巴语天雨1 天前
前端面试-网络协议篇
websocket·网络协议·http·面试·https
小梁不秃捏1 天前
HTTP 常见状态码技术解析(应用层)
网络·网络协议·计算机网络·http
卑微的小鬼1 天前
rpc和http的区别,为啥golang使用grpc 不使用http?
http·rpc·golang