一、websocket介绍
1.1、websocket是什么呢?
websocket是一个协议,它仅仅就是一个协议而已,跟我们所了解的http协议、https协议、ftp协议等等一样,都是一种单纯的协议。
1.2、websocket的特点呢?
相对于Http这种非持久连接而言,websocket协议是一种持久化连接,它是一种独立的,基于TCP的协议。基于websocket,我们可以实现客户端和服务端双向通信。
在websocket出现之前,为了解决此类问题,常用的解决方法有轮询和long pull,这两种技术都是客户端和服务端建立源源不断的HTTP连接,非常消耗带宽和服务器资源。
websocket是双向持久连接,客户端和服务端只需要第一次建立连接即可实现双向通信。
二、Swoole_websocket简介
Swoole增加了内置的WebSocket服务器支持,通过几行PHP代码就可以写出一个异步非阻塞多进程的WebSocket服务器。
onOpen
WebSocket客户端与服务器建立连接并完成握手后会回调此函数。
$req 是一个Http请求对象,包含了客户端发来的握手请求信息
onOpen事件函数中可以调用push向客户端发送数据或者调用close关闭连接
onOpen事件回调是可选的
onMessage
当服务器收到来自客户端的数据帧时会回调此函数。
$frame 是swoole_websocket_frame对象,包含了客户端发来的数据帧信息
onMessage回调必须被设置,未设置服务器将无法启动
$frame
$frame 共有4个属性,分别是:
$frame->fd,客户端的socket_id,使用$server->push推送数据时需要用到。
$frame->data,数据内容,可以是文本内容也可以是二进制数据,可以通过opcode的值来判断
$frame->opcode,WebSocket的OpCode类型,可以参考WebSocket协议标准文档
$frame->finish, 表示数据帧是否完整,一个WebSocket请求可能会分成多个数据帧进行发送
Push方法
$fd 客户端连接的ID,如果指定的$fd对应的TCP连接并非websocket客户端,将会发送失败
$data 要发送的数据内容向websocket客户端连接推送数据,长度最大不得超过2M。
$data 如果是文本类型,编码格式必然是UTF-8,这是WebSocket协议规定的
$opcode,指定发送数据内容的格式,默认为文本。发送其它格式可以参考文档常量