swoole实现发送聊天消息 (单发和群发)

一、服务端

<?php
$server = new swoole_websocket_server("0.0.0.0", 2345);   //自己在阿里云后台开放2345端口
$server->set(array(
    'heartbeat_check_interval' =>600,   检查心跳的间隔
    'heartbeat_idle_time' =>600    //最大心跳间隔
));

$server->on('open', function ($server, $request) {
    $GLOBALS['fd'][$request->fd]['id']=$request->fd;
    echo '欢迎登录,你的id='.$request->fd;
});
$server->on('message', function ($server, $request) {
    $resut = json_decode($request->data);
    $t_id  = $resut[0];
    $msg = $resut[1];
    if(is_numeric($t_id)){  //单发
        $num = 0;
        foreach ($server->connections as $conn){
            if($conn ==$t_id ){  //防止要发送的对方已经不在线了
                $server->push($t_id,$msg);  //主动发送给$t_d
            }
            $num++;
        }
        echo '当前在线人数'.$num;

    }else{  //群发
        foreach ($server->connections as $conn){
            $server->push($conn,$msg);
        }
    }
});
$server->on('close', function ($server, $fd) {   //离开
    echo "{$fd} 下线了\n";
    unset($GLOBALS['fd'][$fd]);
});
$server->start();

二客户端

<html>
<head>
    <meta charset="UTF-8">
    <title>Web sockets test</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <script type="text/javascript">
        var wsServer = 'ws://47.98.24.7:2345'; //服务器地址
        var websocket = new WebSocket(wsServer); //创建WebSocket对象
        websocket.onopen = function (evt) {
//已经建立连接

            $('#send').on('click',function(){
                var msg = $('#msg').val();
                if(msg == '')
                {
                    alert('不能发送空消息');
                    return ;
                }
                var arr =Array();
                arr[0]=1;   //发给谁
                arr[1]=msg;  //内容
                var str = JSON.stringify(arr);
                websocket.send(str);
            });
            $('#send_group').on('click',function(){
                var msg = $('#msg').val();
                if(msg == '')
                {
                    alert('不能发送空消息');
                    return ;
                }
                var arr =Array();
                arr[0]='all';   //发给谁
                arr[1]=msg;  //内容
                var str = JSON.stringify(arr);
                websocket.send(str);
            });
        };

        websocket.onclose = function (evt) {
//已经关闭连接
        };
        websocket.onmessage = function (evt) {
//收到服务器消息,使用evt.data提取\
            console.log(evt.data)
        };
        websocket.onerror = function (evt) {
//产生异常
        };

        function send(){
            $msg = $('#msg').val();
            websocket.send($msg);
        }

    </script>
</head>
<body>
<input id="msg" type="text" name="msg">
<input id="send" type="button" name="" value="单发">
<input id="send_group" type="button" name="" value="群发">
</body>
</html>

<?php

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我了解你的问题。对于使用 ThinkPHP 框架和 Swoole 扩展实现聊天的问题,具体的思路如下: 1. 安装 Swoole 扩展:可以通过编译源码或者安装扩展包的方式进行安装。建议使用 PECL 方式安装,可以通过以下命令安装: ```sh pecl install swoole ``` 2. 创建 Swoole 服务器:在 ThinkPHP 中,可以通过创建一个 Swoole 服务器的任务来实现聊天功能。具体来说,可以在 `application/command` 目录下创建一个 `ChatServer.php` 文件,然后在该文件中编写 Swoole 服务器的逻辑。 3. 实现 WebSocket 协议:由于聊天功能需要使用 WebSocket 协议,因此需要在 Swoole 服务器中实现相应的逻辑。可以使用 Swoole 提供的 `WebSocket\Server` 类来实现 WebSocket 服务器。 4. 处理客户端请求:在 Swoole 服务器中,可以通过注册回调函数来处理客户端的请求。可以在 `onMessage` 回调函数中接收客户端发送消息,并将消息广播给所有的客户端。 5. 实现聊天室功能:可以使用 Swoole 提供的 `Table` 类来实现聊天室功能。可以在 `onOpen` 回调函数中为每个客户端分配一个唯一的 ID,并将其与对应的 WebSocket 连接关联起来。然后在 `onMessage` 回调函数中,可以将客户端发送消息存储到 `Table` 中,并在 `onMessage` 回调函数中广播消息给所有的客户端。 以上就是使用 ThinkPHP 和 Swoole 实现聊天功能的基本思路。具体的实现细节可以根据需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值