一個基于Swoole的websocket聊天室

既然這樣,那我就把我寫的無與倫比的websocket聊天室拿出來吧。

雖然只是一個渣的一比的DEMO,但是能聊...

基于 swoole 做的。 先貼圖片再貼代碼:

websocket聊天室

當然你得先裝了 Swoole 擴展才可以,并且該PHP文件是在 CLI 模式下執(zhí)行的。不要在瀏覽器執(zhí)行。please

PHP代碼:

<?php
/**
 *  基于Swoole的聊天室系統(tǒng)
 */

$server = new Swoole\Websocket\Server("0.0.0.0", 9502);

$server->on('open', function (swoole_websocket_server $server, $frame) {
    //每一次客戶端連接 最大連接數(shù)將增加
    $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" >
    <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()">發(fā)送數(shù)據(jù)</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';
    //調(diào)用websocket對象建立連接:
    //參數(shù):ws/wss(加密)://ip:port (字符串)
    var websocket = new WebSocket(wsServer);
    //onopen監(jiān)聽連接打開
    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>';
        //向服務器發(fā)送數(shù)據(jù)
        websocket.send(text);
    }
    //監(jiān)聽連接關閉
    //    websocket.onclose = function (evt) {
    //        console.log("Disconnected");
    //    };

    //onmessage 監(jiān)聽服務器數(shù)據(jù)推送
    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>';
    };
    //監(jiān)聽連接錯誤信息
    //    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的代碼之類的呢,都能執(zhí)行,真是開心吶。

我也就是寫個例子,來大概跑一下,swoole的websocket的聊天室是怎么聊天的。

有了這個聊天室,真是又能寫篇博客了呀。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內(nèi)容