在2017年10月深圳 Cocos 沙龙上,有幸结识了社区中大名顶顶的Colin,Shawn在论坛上第一次看到Colin的团队用CocosCreator制作的《热血暗黑》时就被深深地震撼到了!更为重要的是,Colin将他的技术心得和宝贵开发经验写成文字,每一篇分享都是满满的干货,而且幸运的是Shawn得到Colin的授权许可,与你一起欣赏一起成长!
从今日起 Colin 大神准备长期驻扎「Creator游戏开发社区」,为大家分享最为硬核的Linux C++ 游戏服务器开发相关知识与经验。
HTTP协议是一个文本协议,从框架上看格式很简单,其复杂在于请求和响应头的处理,以及body的内容编码,如果不是要做一个全面的HTTP服务器,使用少量的代码就能实现一个需求简单的HTTP服务器。我们可以先大致了解一下HTTP协议的内容。
一个URL大概是这样组成的:
protocol://hostname:port/path?query#fragment
典型的例子:
http://www.hello.com:8080/cmd/subcmd?name=tom&age=24
HTTP服务器解析得到URL的时候,需要对它进行分解,得到各个部分,再作进一步的处理。
从上面看URL有些符号是有特殊用途的,比如://?&等等;另外path, query这些部分可能有URL不允许出现的字符,比如中文之类;对这些情况,需要对URL进行编码,编码成URL允许的字符。
这些字符以%开头,后面跟两个16进制的字符,比如%20表示空格。如果用Lua来实现,编码是这样的:
local function escape(s)
return (string.gsub(s, "([^A-Za-z0-9_])", function(c)
return string.format("%%%02X", string.byte(c))
end))
end
解码是这样的:
local function decode_func(c)
return string.char(tonumber(c, 16))
end
local function decode(str)
local str = str:gsub('+', ' ')
return str:gsub("%%(..)", decode_func)
end
注意编码和解码通常应该用于query的key/value,其他部分应该尽量约束使用字母和下划线。
HTTP是基于请求和回应的模式,客户端请求的总体格式是:
<Request Line>
<Request Headers>
<Request Body>
用一个图来表示是这样的:
响应文本和请求类似:
<Response Line>
<Response Headers>
<Response Body>
同样用一个图来表示:
本文分享自 Creator星球游戏开发社区 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!