美文网首页程序员php framework
一个基于Swoole的websocket聊天室

一个基于Swoole的websocket聊天室

作者: 郭贰小姐 | 来源:发表于2018-12-18 14:12 被阅读6次

    既然这样,那我就把我写的无与伦比的websocket聊天室拿出来吧。

    虽然只是一个渣的一比的DEMO,但是能聊...

    基于 swoole 做的。 先贴图片再贴代码:

    websocket聊天室

    当然你得先装了 Swoole 扩展才可以,并且该PHP文件是在 CLI 模式下执行的。不要在浏览器执行。please

    PHP代码:

    <?php
    /**
     *  基于Swoole的聊天室系统
     */
    
    $server = new Swoole\Websocket\Server("0.0.0.0", 9502);
    
    $server->on('open', function (swoole_websocket_server $server, $frame) {
        //每一次客户端连接 最大连接数将增加
        $message = "欢迎 连接号{$frame->fd}:进入了聊天室";
        echo $message."\n";
        foreach ($server->connections as $key => $value) {
            if($frame->fd != $value){
                $server->push($value, $message);
            }
        }
    });
    
    $server->on('message', function (swoole_websocket_server $server, $frame) {
        $fd   = $frame->fd;
        $data = $frame->data;
        $message = "[连接号{$fd}]:{$data}";
        //向所有人广播
        foreach ($server->connections as $key => $value) {
            if($frame->fd != $value){
                $server->push($value, $message);
            }
        }
    });
    
    $server->on('close', function (swoole_websocket_server $server, $fd) {
        //关闭连接 连接减少
        $message = "连接号{$fd}:退出了聊天室";
        echo "client {$fd} closed\n";
        foreach ($server->connections as $key => $value) {
            if($fd != $value){
                $server->push($value, $message);
            }
        }
    });
    
    $server->start();
    

    在处理消息的时候一定要注意安全防护,假如你要存库或者干什么,不然很容易被注入之类的...

    html代码:(javascript的websocket,bootstrap)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
        <title>聊天室-opqnext.com</title>
        <script src="js/libs/jquery-2.1.1.min.js"></script>
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
        <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
        <link rel="stylesheet" type="text/css" media="screen" href="css/jquery.toastmessage.css">
        <script src="js/jquery.toastmessage.js"></script>
        <style>
    
            body {
                width: 600px;
                margin: 40px auto;
                font-family: 'trebuchet MS', 'Lucida sans', Arial;
                font-size: 14px;
                color: #444;
            }
    
        </style>
    </head>
    <body>
    <div id="myCarousel" class="carousel slide">
        <!-- 轮播(Carousel)指标 -->
        <ol class="carousel-indicators">
            <li data-target="#myCarousel" data-slide-to="0" class="active"></li>
            <li data-target="#myCarousel" data-slide-to="1"></li>
            <li data-target="#myCarousel" data-slide-to="2"></li>
        </ol>
        <!-- 轮播(Carousel)项目 -->
        <div class="carousel-inner">
            <div class="item active">
                <img src="../img/1.jpg" alt="First slide">
            </div>
            <div class="item">
                <img src="../img/2.jpg" alt="Second slide">
            </div>
            <div class="item">
                <img src="../img/3.jpg" alt="Third slide">
            </div>
        </div>
        <!-- 轮播(Carousel)导航 -->
        <a class="carousel-control left" href="#myCarousel"
           data-slide="prev">&lsaquo;</a>
        <a class="carousel-control right" href="#myCarousel"
           data-slide="next">&rsaquo;</a>
    </div>
    <h2>聊天室(CHAT ROOM)</h2>
    
    <br><br>
    <br><br>
    <div id="msg"></div>
    <div class="form-group">
        <input class="form-control"  style="width: 50%;float: left" type="text" id="text">
        <button type="button" class="btn btn-primary" data-loading-text="Loading..."  value="" style="float: left;margin-left: 10px;" onclick="song()">发送数据</button>
    </div>
    <audio id="audio1" width="420" >
        <source src="img/6571.wav" type="audio/wav" />
        <source src="img/17.ogg" type="audio/ogg" />
    </audio>
    </body>
    <script>
        Date.prototype.Format = function (fmt) { //author: meizz
            var o = {
                "M+": this.getMonth() + 1, //月份
                "d+": this.getDate(), //日
                "h+": this.getHours(), //小时
                "m+": this.getMinutes(), //分
                "s+": this.getSeconds(), //秒
                "q+": Math.floor((this.getMonth() + 3) / 3), //季度
                "S": this.getMilliseconds() //毫秒
            };
            if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
            for (var k in o)
                if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            return fmt;
        }
        var msg = document.getElementById("msg");
        var wsServer = 'ws://192.168.221.110:9502';
        //调用websocket对象建立连接:
        //参数:ws/wss(加密)://ip:port (字符串)
        var websocket = new WebSocket(wsServer);
        //onopen监听连接打开
        websocket.onopen = function (evt) {
            msg.innerHTML = websocket.readyState;
        };
    
        function song(){
            var text = document.getElementById('text').value;
            document.getElementById('text').value = '';
            var date = new Date().Format("MM-dd hh:mm:ss");
            msg.innerHTML += '<p class="text-center"><span class="badge" style="background-color:#E0E0E0">'+date+'</span></p>';
            msg.innerHTML += '<p class="text-right">[我]: '+ text+'</p>';
            //向服务器发送数据
            websocket.send(text);
        }
        //监听连接关闭
        //    websocket.onclose = function (evt) {
        //        console.log("Disconnected");
        //    };
    
        //onmessage 监听服务器数据推送
        websocket.onmessage = function (evt) {
            $().toastmessage('showSuccessToast', "您有新消息啦!");
            var audio = document.getElementById("audio1");
            audio.play();
            var date = new Date().Format("MM-dd hh:mm:ss");
            msg.innerHTML += '<p class="text-center"><span class="badge" style="background-color:#E0E0E0">'+date+'</span></p>';
            msg.innerHTML += '<p class="text-left">'+evt.data +'</p>';
        };
        //监听连接错误信息
        //    websocket.onerror = function (evt, e) {
        //        console.log('Error occured: ' + evt.data);
        //    };
    
    
        $(function() {
            $("#myCarousel").carousel('cycle');
    //         $().toastmessage('showSuccessToast', "您有新消息啦!");
    //         var audio = document.getElementById("audio1");
    //         audio.play();
        });
    </script>
    </html>
    

    你看我这个聊天室就神奇的很呐,几乎没做什么安全过滤,你输入什么html,javascript的代码之类的呢,都能执行,真是开心呐。

    我也就是写个例子,来大概跑一下,swoole的websocket的聊天室是怎么聊天的。

    有了这个聊天室,真是又能写篇博客了呀。

    相关文章

      网友评论

        本文标题:一个基于Swoole的websocket聊天室

        本文链接:https://www.haomeiwen.com/subject/hzxlkqtx.html