Http 服务器

skynet 从 v0.5.0 开始提供了简单的 http 服务器的支持。skynet.httpd 是一个独立于 skynet 的,用于 http 协议解析的库,它本身依赖 socket api 的注入。使用它,你需要把读写 socket 的 API 封装好,注入到里面就可以工作。


skynet.sockethelper 模块将 skynet 的 Socket API 封装成 skynet.httpd 可以接受的形式:阻塞读写指定的字节数、网络错误以异常形式抛出。

下面是一个简单的范例:

-- examples/simpleweb.lua

local skynet = require "skynet"
local socket = require "socket"
local httpd = require "http.httpd"
local sockethelper = require "http.sockethelper"
local urllib = require "http.url"
local table = table
local string = string

local mode = ...

if mode == "agent" then

local function response(id, ...)
    local ok, err = httpd.write_response(sockethelper.writefunc(id), ...)
    if not ok then
        -- if err == sockethelper.socket_error , that means socket closed.
        skynet.error(string.format("fd = %d, %s", id, err))
    end
end

skynet.start(function()
    skynet.dispatch("lua", function (_,_,id)
        socket.start(id)  -- 开始接收一个 socket
        -- limit request body size to 8192 (you can pass nil to unlimit)
        -- 一般的业务不需要处理大量上行数据,为了防止攻击,做了一个 8K 限制。这个限制可以去掉。
        local code, url, method, header, body = httpd.read_request(sockethelper.readfunc(id), 8192)
        if code then
            if code ~= 200 then  -- 如果协议解析有问题,就回应一个错误码 code 。
                response(id, code)
            else
                -- 这是一个示范的回应过程,你可以根据你的实际需要,解析 url, method 和 header 做出回应。
                local tmp = {}
                if header.host then
                    table.insert(tmp, string.format("host: %s", header.host))
                end
                local path, query = urllib.parse(url)
                table.insert(tmp, string.format("path: %s", path))
                if query then
                    local q = urllib.parse_query(query)
                    for k, v in pairs(q) do
                        table.insert(tmp, string.format("query: %s= %s", k,v))
                    end
                end
                response(id, code, table.concat(tmp,"\n"))
            end
        else
            -- 如果抛出的异常是 sockethelper.socket_error 表示是客户端网络断开了。
            if url == sockethelper.socket_error then
                skynet.error("socket closed")
            else
                skynet.error(url)
            end
        end
        socket.close(id)
    end)
end)

else

skynet.start(function()
    local agent = {}
    for i= 1, 20 do
        -- 启动 20 个代理服务用于处理 http 请求
        agent[i] = skynet.newservice(SERVICE_NAME, "agent")  
    end
    local balance = 1
    -- 监听一个 web 端口
    local id = socket.listen("0.0.0.0", 8001)  
    socket.start(id , function(id, addr)  
        -- 当一个 http 请求到达的时候, 把 socket id 分发到事先准备好的代理中去处理。
        skynet.error(string.format("%s connected, pass it to agent :%08x", addr, agent[balance]))
        skynet.send(agent[balance], "lua", id)
        balance = balance + 1
        if balance > #agent then
            balance = 1
        end
    end)
end)

end

这个 httpd 模块最初是用于服务器内部管理,以及和其它平台对接。所以只提供了最简单的功能。如果是重度的业务要使用,可以考虑再其上做进一步的开发。

httpc

skynet 提供了一个非常简单的 http 客户端模块。你可以用:

httpc.request(method, host, uri, recvheader, header, content)

来提交一个 http 请求,其中

  • method 是 "GET" "POST" 等。
  • host 为目标机的地址
  • uri 为请求的 URI
  • recvheader 可以是 nil 或一张空表,用于接收回应的 http 协议头。
  • header 是自定义的 http 请求头。注:如果 header 中没有给出 host ,那么将用前面的 host 参数自动补上。
  • content 为请求的内容。

它返回状态码和内容。如果网络出错,则抛出 error 。

httpc.dns(server, port)

可以用来设置一个异步查询 dns 的服务器地址。如果你不给出地址,那么将从 /etc/resolv.conf 查找地址。如果你没有调用它设置异步 dns 查询,那么 skynet 将在网络底层做同步查询。这很有可能阻塞住整个 skynet 的网络消息处理(不仅仅阻塞单个 skynet 服务)。

另外,httpc 还提供了简单的 httpc.get 以及 httpc.post 的封装,具体可以参考源代码。

如果有https的需求,可使用 lua-webclient 它是libcurl multi interface的简单封装,支持单线程,非阻塞的大量http、https请求。

httpc 可以通过设置 httpc.timeout 的值来控制超时时间。时间单位为 1/100 秒。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
W5500是一款高集成度和高性能的以太网控制器。它集成了TCP/IP协议栈和硬件以太网物理层接口,能够提供稳定可靠的以太网连接。W5500还支持SPI接口,方便与主控芯片进行通信。 W5500可以被用于实现一个简单的HTTP服务器HTTP(Hypertext Transfer Protocol)是一种应用层协议,用于在客户端和服务器之间传输超文本和其他资源,常用于网页浏览。 在使用W5500实现HTTP服务器时,首先需要设置W5500的网络参数,包括IP地址、子网掩码和网关地址。然后,可以通过配置W5500的Socket,将其设置为TCP服务器模式并指定端口号。当有客户端发起HTTP请求时,W5500会接收到请求数据,并根据请求内容生成相应的HTTP响应。最后,将响应数据发送给客户端。 在HTTP服务器中,可以实现一些常见的功能,例如静态网页的访问、文件的上传和下载、数据的查询和处理等。通过解析HTTP请求,可以从中获取请求的URL和参数,并根据这些信息进行相应的处理和回应。 使用W5500实现HTTP服务器时,需要合理利用W5500的缓冲区和数据传输时序,以提高系统的响应速度和性能。此外,还需要考虑网络安全性和系统稳定性,例如进行合适的权限验证和异常处理等。 总之,W5500是一款适合实现HTTP服务器的高性能以太网控制器。通过合理配置和设计,可以实现功能丰富、高效可靠的HTTP服务器应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值