使用Swoole服务搭建简易聊天室代码

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

使用Swoole服务搭建简易聊天室

服务端

创建chatserver.php 文件

<?php

class Chat
{
    const HOST = '0.0.0.0';//ip地址 0.0.0.0代表接受所有ip的访问
    const PART = 81;//端口号
    private $server = null;//单例存放websocket_server对象

    public function __construct()
    {
        //实例化swoole_websocket_server并存储在我们Chat类中的属性上,达到单例的设计
        $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->set([
            'document_root' => '/data/web/chat/public',//这里传入静态文件的目录
            'enable_static_handler' => true//允许访问静态文件
        ]);
        //开启服务
        $this->server->start();
    }

    /**
     * 连接成功回调函数
     * @param $server
     * @param $request
     */
    public function onOpen($server, $request)
    {
        echo $request->fd . '连接了' . PHP_EOL;//打印到我们终端
    }

    /**
     * 接收到信息的回调函数
     * @param $server
     * @param $frame
     */
    public function onMessage($server, $frame)
    {
    /**
         * TCP连接迭代器,可以使用foreach遍历服务器当前所有的连接,此属性的功能与swoole_server->connnection_list是一致的,但是更加友好。遍历的元素为单个连接的fd
         *
         * 连接迭代器依赖pcre库,未安装pcre库无法使用此功能
         *
         *      foreach($server->connections as $fd)
         *      {
         *          $server->send($fd, "hello");
         *      }
         *
         *      echo "当前服务器共有 ".count($server->connections). " 个连接\n";
         *
         * @var \Swoole\Connection\Iterator
         */
        echo $frame->fd . '来了,说:' . $frame->data . PHP_EOL;//打印到我们终端
        foreach ($server->connections as $fd) {//遍历TCP连接迭代器,拿到每个在线的客户端id
            //将客户端发来的消息,推送给所有用户,也可以叫广播给所有在线客户端
            $server->push($fd, json_encode(['no' => $frame->fd, 'msg' => $frame->data]));
        }
    }

    /**
     * 断开连接回调函数
     * @param $server
     * @param $fd
     */
    public function onClose($server, $fd)
    {
        echo $fd . '走了' . PHP_EOL;//打印到我们终端
    }

}


$obj = new Chat();


?>

客户端

创建liaotian.html文件

<!doctype html>

<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;">

=======聊天室======

</textarea>

<input type="button" value="连接" onClick="link()">

<input type="button" value="断开" onClick="dis()">

<input type="text" id="text">

<input type="button" value="发送" onClick="send()">

<script>

    function link() {

        var url = 'ws://20.20.24.131:81';

        socket = new WebSocket(url);

        socket.onopen = function () {
            log1('连接成功')
        }

        socket.onmessage = function (msg) {
            log(msg.data);
            console.log(msg);
        }

        socket.onclose = function () {
            log1('断开连接')
        }

    }

    function dis() {

        socket.close();

        socket = null;

    }

    function log1(var1) {
        $('.log').append(var1 + '\r\n');
    }

    function log(var1) {
        var v = $.parseJSON(var1)
        $('.log').append('用户' + v['no'] + '说:' + v['msg'] + '\r\n');
    }

    function send() {
        var text = $('#text').val();
        socket.send(text);
    }

    function send2() {
        var json = JSON.stringify({'type': 'php', 'msg': $('#text2').attr('value')})
        socket.send(json);
    }
</script>
</body>

</html>

启动服务端

php chatserver.php

在这里插入图片描述

浏览器中访问聊天室

http://20.20.24.131/chat/liaotian.html
在这里插入图片描述点击链接,可以看到页面显示连接成功

打开服务端,可以看到
在这里插入图片描述表示连接成功

输入奇葩天地网 点击发送
在这里插入图片描述服务端,可以看到收到了客户端的聊天内容
在这里插入图片描述
客户端,点击断开

在这里插入图片描述服务端,可以看到 客户端1,走了
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值