AJAX和WebSocket

本文说一说在web页面进行网络通讯的内容

AJAX

客户端可以在JS中发起一次http请求,并异步接收结果
其最直接的影响就是可以在不刷新页面的前提下更新页面内容,给web app铺平了道路

JS端写法:

实例化对象,然后注册事件,连接并发送。注册事件需要在其他操作之前进行
ajax有5个state:0表示未初始化,1表示连接已建立,2表示请求已接收,3表示请求处理中,4表示请求完成并且可以本地读取
每次状态变化都会触发onreadystatechange事件。一般我们只对最后的结果感兴趣,所以有个条件判断

服务端写法:
uWebSocket代码如下

示例是post所以注册post处理函数,但是注意reqest并没有提取body的接口,这是因为body的数据长度没有限制,如果很大(比如传文件)则传输有一个过程
要提取body必须在response里注册onData,即body部分有内容传过来时调用。为了方便还有一个bool,如果所有数据都传完了则为true,方便逻辑处理。如果post body过长,很可能分段传过来,即onData会多次调用,此时需要设计如何把每一段数据存储起来的问题。
另外如果注册了onData则必须也注册onAborted,即请求中断。不特别处理也需要注册一个
库保证在连接中断前response指针一直有效

运行效果

WebSocket

AJAX只能是客户端主动发起且oneshot,于是有了H5新增的web socket
优点是keep connection而且既可以send也可以recv,基本上跟raw socket没什么区别,只不过用的是ws(s)协议
客户端写法:

ws是一种协议,所以建立连接时要指明。wss是使用了SSL的ws
用法就是onXXX注册函数对象,除了上述展示的例子外还有onerror和onclose
方法就两个,已经都在上面了
特别注意需要onopen之后才能send

服务端写法:
uWebSocket代码如下

乍看起来有点某明其妙,但是解释一下就清楚了
注册ws方法,这里有一个template,即可以自己提供类型作为user data。每个websock单独一份,方便存储会话信息,使用getUserData获取指针
router写法一样,但是后面的跟传统http方法有区别
http方法都是直接提供函数对象,但是ws自身有不同的状态和方法,所以这里提供的是一个叫做WebSocketBehavior的结构体,结构体定义了属性和onXXX
有一套默认数值,然后开发人员自己提供需要override的,这个写法就变成了{.XXX = YYY},应该是C++17新语法
经过这么解释就听清楚了,是个echo功能,顺带展示了user data用法

运行效果: