swoole的socket实现聊天功能

前言

贵有恒,何必三更起五更睡;最无益,只怕一日暴十寒。
偶然打开CSDN,忽然发现距离上一篇文章整整过去了一年。感慨时间过去飞快。这一年忙忙碌碌,但又没什么变化。一周一篇文章的约定,不知从哪天的忙碌开始抛到脑后。
裸辞后,休息了一个月,最近开始整理知识点。突然想起来要记录。那就坚持吧。不知道能坚持几天,但有开始总是好的。

实现思路

  1. 实现socket服务器。能连接、接受消息并作出回应、中断退出。
  2. 能对所有连接到服务器的客户端广播信息。
  3. 使用昵称聊天。
  4. 一对一聊天。

实现简单echo服务器

服务端代码实现

class Chat
{

    const HOST = '0.0.0.0'; //允许所有ip的访问
    const PART = 9501; //端口号
    private $server = null;  //服务对象
    private $connectList = [];

    public function __construct(){

        $this->server = new swoole_websocket_server(self::HOST, self::PART);

        //监听连接事件
        $this->server->on('open', [$this, 'onOpen']);
        //监听接收消息事件
        $this->server->on('message', [$this, 'onMessage']);
        //监听关闭事件
        $this->server->on('close', [$this, 'onClose']);
        //开启服务
        $this->server->start();
    }

    /**
     * 连接成功回调函数
     * @param $server
     * @param $request
     */
    public function onOpen($server, $request)
    {
        echo $request->fd . '已连接' . PHP_EOL;//输出终端
        $this->connectList[] = $request->fd; // 存储连接上的客户端
    }

    /**
     * 接收到信息的回调函数
     * @param $server
     * @param $frame
     * @return bool
     */
    public function onMessage($server, $frame)
    {
        $data = $frame->data;
        // 群发
        echo $frame->fd . '说:' . $data . PHP_EOL;//打印到我们终端
        //将这个用户的信息存入集合
        foreach ($this->connectLis as $fd) {// 遍历客户端的集合
            $server->push($fd, json_encode(['no' => $frame->fd , 'msg' => $data]));
        }
    }

    /**
     * 断开连接回调函数
     * @param $server
     * @param $fd
     */
    public function onClose($server, $fd)
    {
        echo $fd . '断开连接' . PHP_EOL;//输出到终端终端
        $this->connectList = array_diff($this->connectList, [$fd]);  //移除断开连接的客户端
    }

}

$obj = new Chat();

终端运行socket服务。 php test.php;

客户端代码实现


<html>

<head>

    <meta charset="utf-8">

    <title>聊天室</title>

    <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>

</head>

<body>

<textarea class="log" style="width: 100%; height: 500px;">

=======聊天室==&
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 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` 回调函数中广播消息给所有的客户端。 以上就是使用 ThinkPHPSwoole 实现聊天功能的基本思路。具体的实现细节可以根据需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值