一、背景:学习+研究
技术栈:Swoole + Linux + jQuery + HTML + CSS
Swoole是高性能的PHP协程框架,适用于高并发、高性能要求的领域,为PHP性能的提升提供了独一无二的可能性。
WebSocket是B/S或C/S网络结构模式下实现双方实时通信的协议,是一种在单个TCP连接上进行全双工通信的协议。Swoole\Websocket\Server 继承自 Swoole\Http\Server,是实现了WebSocket协议的服务器。
只有WebSocket客户端才能与WebSocket服务器通信。
二、类说明
WebScoket 服务器:
Swoole\WebSocket\Server
方法:
onopen() 监听WebSocket连接打开事件
onmessage() 监听WebSocket消息事件
onclose() 监听WebSocket连接关闭事件
push() 推送消息到已连接的客户端
isEstablished() 判断WebSocket连接是否正确
代码片段解析:
1、使用 FILE 作为存储层实现数据存储,当然还可以选择Redis等服务,也可以用Swoole\Table等实现,这里只为学习 WebSocket。
2、发送消息的时候,每个消息都定义一个类型 type,便于客户端解析数据做业务逻辑。
type 类型有:
USER_IN 用户登录
USER_OUT 用户离开
USER_MSG 用户发送的消息
3、$ws->isEstablished 是为了判断连接是否有效,保证推送消息能够成功。
if ($ws->isEstablished($fd)) {
$ws->push($fd, json_encode($data));
}
4、服务器接收到消息时,服务器会轮询把消息推送给所有用户(包括消息发送者),所以要区分一下消息是否是自己发送的。
foreach ($ws->connections as $item_fd) {
if($item_fd != $frame->fd){
$data = [
//'num' => $num,
'msg' => $frame->data,
'type' => 'USER_MSG',
'from_fd' => $frame->fd
];
// 判断websocket连接是否正确,否则会push失败
if ($ws->isEstablished($item_fd)) {
$ws->push($item_fd, json_encode($data));
}
}else{
$data = [
//'num' => $num,
'msg' => $frame->data,
'type' => 'USER_MSG',
'from_fd' => $frame->fd
];
$ws->push($frame->fd, json_encode($data));
}
}
程序源码:
服务端:PHP代码:ws_chat_server.php
<?php
defin