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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值