后端:uWebSocket

uWebSockets是一个web服务器,以c++编写。
极简,header-only,除了自家的uSocket外没有硬性依赖项
支持ssl,可以处理http(s)和ws(s)
效率高自然是不必说的……
使用起来也很简单,所有跟网络IO和http(s)相关的内容都处理了,只需要关注业务逻辑即可

编译和工程

虽然https://github.com/uNetworking/uWebSockets只有头文件,但是依赖的https://github.com/uNetworking/uSockets是c语言写的
一种方式是直接把uSocket的源代码加入工程,另一种方式是先编译uSocket然后导入lib
加源码很直观就不说了,后一种的步骤是:
进入文件夹然后make,即可得到uSockets.a。默认就是支持SSL的(源代码自带openSSL文件)
然后make install,放入系统默认库路径
有了库后就是新建工程,把uWebSockets的所有文件加入(只有头文件所以省事),导入uSockets.a即可

然后提一句工程的宏定义
如果定义了LIBUS_NO_SSL则不使用SSL
如果定义了UWS_NO_ZLIB则不使用Zlib(换言之服务器默认使用zlib压缩数据,所以需要有zlib的库)

使用

直接上代码

应该说非常直观
首先建立一个App作为服务器的抽象。如果需要SSL则使用uWS::SSLApp
SSLApp构造时可以穿入参数指定私钥和证书,详见官方示例

接下来使用函数式编程的范式来初始化App
具体而言,针对http的方法和路径,传入函数对象实现自定义行为
示例里的代码就是任何get方法,不管路径如何都返回预定义的strHtml内容

然后指定监听端口,开始运行
run会阻塞,并没有中途干预的方式,外部直接kill终止进程

启动服务后打开浏览器,输入http://localhost:8080/即可显示页面

静态服务器

使用uWebSocket可以非常轻松的搭建静态web服务器
核心思路就是针对get方法判断目标资源是否存在,如果存在就读取内容并返回,否则返回404

单独写个函数,然后在.get(“/“)里传入函数名即可,会自动变为函数对象。对于复杂一点的操作这样好模块化管理 另外提一句层级。uWebSocket里如果同样的router有不同的函数对象,则只会执行更具体的那个 比如给.get(“/login”)注册了函数对象,则.get(“/“)就被override了

然后注意一下url前面有个.,转为当前路径,不然就按照绝对路径处理了
request类除了获取url,还可以获取所有头部信息,以及query信息,都有现成接口

response的常用操作也有现成接口。这里做了简单处理,大文件的场合需要更多考虑因素,见官方示例

运行服务器,然后打开浏览器访问

可以看到这个页面有3次get请求,分别是页面、脚本和图片。都顺利加载了
当然这个还是只toy project,真的要做一个静态服务器也不是那么容易的,需要考虑各种因素。建议还是用更加专门的工具来搭建