swoole学习之websocket服务端和客户端

23 篇文章 0 订阅
9 篇文章 0 订阅

websocket 服务端

websocketService.php

<?php
//实例化 websocket 服务
$server = new Swoole\WebSocket\Server("0.0.0.0", 9502);
//监听websocket链接打开事件
$server->on('open', function (Swoole\WebSocket\Server $server, $request) {
    echo "<ore>";
    print_r($request);
    echo "server: handshake success with fd{$request->fd}\n";
});

//监听websocket消息事件
$server->on('message', function (Swoole\WebSocket\Server $server, $frame) {

    echo "<ore>";
    print_r($frame);

    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
    //向websocket链接的客户端推送数据
    $server->push($frame->fd, "this is websocket server");
});

//关闭事件
$server->on('close', function ($ser, $fd) {
    echo "client {$fd} closed\n";
});

//开启服务
$server->start();
?>

客户端向服务器端发送信息时,服务器端触发 onMessage 事件回调
服务器端可以调用 $server->push() 向某个客户端(使用 $fd 标识符)发送消息

先启动httpServer服务

php server/httpService.php

再启动websocketserver服务

php server/websocketService.php

websocket 客户端

websocket.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>swoole学习之websocket_server服务器代码_徊忆羽菲的博客-CSDN博客</title>
</head>
<body>
<h1>websocket服务器测试</h1>

<script type="application/javascript">
    //定义一个websocket服务器的路径
    var wsUrl = 'ws://20.20.24.131:9502';

    var ws_server = new WebSocket(wsUrl);

    //实例化open属性 判断是否链接websocket成功
    ws_server.onopen = function (evt) {

        //发送数据
        ws_server.send('hello websocket!');
        console.log('connect-swoole-websocket-success');
    }

    //实例化onmessage
    ws_server.onmessage = function (evt) {
        console.log('connect-swoole-websocket-message', evt.data);
    }
    //实例化close
    ws_server.onclose = function (evt) {
        console.log('connect-swoole-websocket-close');
    }
    //实例化close
    ws_server.onerror = function (evt, e) {
        console.log('connect-swoole-websocket-error', e.errorCode);
    }
</script>
</body>
</html>

在浏览器中访问

http://20.20.24.131:9501/websocket.html

可以看到console.log打印的日志信息
在这里插入图片描述消息头中返回的响应信息
在这里插入图片描述

websocket设置参数

在websocketService.php 中配置参数

<?php
//实例化 websocket 服务
$server = new Swoole\WebSocket\Server("0.0.0.0", 9502);

//配置参数
$server->set([
    'enable_static_handler' => true,
    'document_root' => '/data/web/swoole_mooc/static'
]);

保存,重新启动websocket服务器,可以关闭http服务器, 无需启动http服务器,在浏览器中访问:

http://20.20.24.131:9502/websocket.html

注意:域名端口号需要更换成websocket服务器的端口号,而不是之前的9501

在这里插入图片描述
在这里插入图片描述
查看websocket服务端返回数据

在这里插入图片描述

websocket封装基础类

创建 websocket.Class.php

<?php
/*优化websocket基础类
 *
 * */

class Ws
{

    //定义host
    const HOST = '0.0.0.0';
    //定义端口号
    const PORT = 9502;
    //定义变量
    public $ws = '';

    //构造函数
    public function __construct()
    {
        $this->ws = new Swoole\WebSocket\Server(self::HOST, self::PORT);
        //定义方法
        $this->ws->on('open', [$this, 'onOpen']);
        $this->ws->on('message', [$this, 'onMessage']);
        $this->ws->on('close', [$this, 'onClose']);
        //启动服务
        $this->ws->start();
    }

    //定义链接websocket服务事件的方法
    public function onOpen($ws, $request)
    {
        echo "<pre>";
        print_r($request);
    }


    //定义websocket服务消息事件的方法
    public function onMessage($ws, $frame)
    {
        echo "frame<pre>";
        print_r($frame);
        echo '获取到客户端发送过来的数据' . $frame->data;
        //给客户端回应,发送内容
        $ws->push($frame->fd, 'wesocketServe-push-data:www.qipa250.com');
    }

    //定义关闭websocket服务的方法
    public function onClose($ws, $fd)
    {
        echo '客户端:' . $fd . '断开了websocket服务!';
    }

}

//实例化

$ws = new Ws();

?>

以上代码,仍然依赖httpserver,所以需要启动httpserver

php server/httpService.php

再启动websocket服务

php server/websocket.Class.php

websocket客户端 代码
websocket.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>swoole学习之websocket_server服务器代码_徊忆羽菲的博客-CSDN博客</title>
</head>
<body>
<h1>websocket服务器基础类测试</h1>

<script type="application/javascript">
    //定义一个websocket服务器的路径
    var wsUrl = 'ws://20.20.24.131:9502';

    var ws_server = new WebSocket(wsUrl);

    //实例化open属性 判断是否链接websocket成功
    ws_server.onopen = function (evt) {

        //发送数据
        ws_server.send('hello websocket!');
        console.log('connect-swoole-websocket-success');
    }

    //实例化onmessage
    ws_server.onmessage = function (evt) {
        console.log('connect-swoole-websocket-message', evt.data);
    }

    //实例化close
    ws_server.onclose = function (evt) {
        console.log('connect-swoole-websocket-close');
    }

    //实例化close
    ws_server.onerror = function (evt, e) {
        console.log('connect-swoole-websocket-error', e.errorCode);
    }

</script>

</body>
</html>

在浏览器中预览效果

http://20.20.24.131:9501/websocket.html

在这里插入图片描述
可以看到,连接websocket成功,且接收到了来自服务端的数据信息

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值