创建websocket服务器
建议先阅读官方文档WebSocket\Server章节
一、websocket介绍
二、Swoole_websocket简介
三、websoket服务创建
一、websocket介绍
1、websocket是什么呢?
websocket是一个协议,它仅仅就是一个协议而已,跟我们所了解的http协议、https协议、ftp协议等等一样,都是一种单纯的协议。
2、websocket的特点呢?
相对于Http这种非持久连接而言,websocket协议是一种持久化连接,它是一种独立的,基于TCP的协议。基于websocket,我们可以实现客户端和服务端双向通信。
在websocket出现之前,为了解决此类问题,常用的解决方法有轮询和long pull,这两种技术都是客户端和服务端建立源源不断的HTTP连接,非常消耗带宽和服务器资源。
websocket是双向持久连接,客户端和服务端只需要第一次建立连接即可实现双向通信。
列出WebSocket特点:
建立在TCP协议
性能开销小通信高效
客户端可以与任意服务器通信
协议标识符ws wss
持久化网络通信协议(长连接)
二、Swoole_websocket简介
Swoole增加了内置的WebSocket服务器支持,通过几行PHP代码就可以写出一个异步非阻塞多进程的WebSocket服务器。

1、websocket_server是在swoole_http_server基础之上做了协议解析
2、完整的websocket协议会封装在frame对象当中
三、websoket服务创建
简单示例:

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,指定发送数据内容的格式,默认为文本。发送其它格式可以参考文档常量
注意:
1、连接保持+心跳
Websocket也是长连接的形式,同样支持自己实现心跳包的检测
2、校验客户端连接的有效性
我们创建的websocket_server,是对外开放的,也就是任何人都能连接过来,对于非websocket协议同样能触发,所以我们要判断当前是websocket客户端并且能够通讯才进行发送。
根据以上注意的两点,示例:
websocket client端的代码:
Last updated
Was this helpful?