本文只简单实现使用swoole搭建异步非阻塞多进程websocket服务器实例,具体流程参数配置详情请参照swoole官网。
程序代码
服务器端
WebSocketServer.php
<?php
/**
* User: 侯光龙
* FileName: swoole-websocket
* Date: 2019/3/23
* Time: 20:26
*/
use Swoole\WebSocket\Server;
//创建swoole_websocket服务 监听 8812端口
$server = new Server('0.0.0.0',8812);
$server->set([
'enable_static_handler'=>true,
'document_root'=>'/home/learn/bd_git/php_swoole/demo/data' //配置静态文件根目录
]);
/**
* onopen事件 监听服务器与客户端完成连接 成功握手后执行回调函数
* @param object $server websocket对象
* @param object $request Http请求对象,包含客户端发来的握手请求信息
*/
//onopen事件 监听服务器与客户端完成连接 成功握手后执行回调函数
$server->on('open',function (Swoole\WebSocket\Server $server,$request){
echo "server: handshake success with fd-{$request->fd}";
});
/**
* onmessage事件 监听客户端发送数据接收
* @param object $server websocket对象
* @param array $frame swoole_websocket_frame对象,包含了客户端发来的数据帧信息
*/
// 执行回调函数 返回数据给客户端push
$server->on('message',function (Swoole\WebSocket\Server $server,$frame){
echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
//发送数据给客户端 push(客户端连接的ID,发送的数据内容,发送数据内容的格式,默认为文本,发送结果bool)
$server->push($frame->fd,'hello my name is houguang',1,true);
});
//关闭连接
$server->on('close',function ($ser,$fd){
echo "client {$fd} closed\n";
});
//开启服务
$server->start();
客户端
ws_client.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
Hello My Name is Houguang!!!
</body>
<script>
//websocket 地址
var wsUrl = 'ws://X.X.X.X:8812';
//创建websocket对象实例
var websocket = new WebSocket(wsUrl);
//成功和websockte服务建立连接 执行回调函数
websocket.onopen = function (evt) {
//连接成功 发送数据给服务器
websocket.send('How are you?');
console.log('wb_server-connect-success');
}
//接收服务器返回数据
websocket.onmessage = function (evt) {
console.log('ws_server-return-data:'+evt.data);
}
//连接关闭
websocket.onclose = function (evt) {
console.log('ws_server-close');
}
//发送错误
websocket.onerror = function (evt,err) {
console.log('ws_server-error-data:'+err);
}
</script>
</html>
测试
开启websocket服务
php WebSocketServer.php
通过浏览器访问 IP地址+端口号
http头部信息包含websocket信息
服务端响应信息