<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        利用webSocket與Swoole打造一個小型聊天室

        來源:懂視網 責編:小采 時間:2020-11-27 14:00:05
        文檔

        利用webSocket與Swoole打造一個小型聊天室

        利用webSocket與Swoole打造一個小型聊天室:前言 本次僅記錄 webSocket 與 Swoole 配合打造一個小型的聊天室,功能簡陋,但是可以作為一個很好的入門案例。項目簡介 本來就是作為一個很小的案例來寫的,包含的功能點也不是那多,索性就按照最最最低配置來搞。能夠顯示聊天消息的聊天區,同時兼顧顯示鏈
        推薦度:
        導讀利用webSocket與Swoole打造一個小型聊天室:前言 本次僅記錄 webSocket 與 Swoole 配合打造一個小型的聊天室,功能簡陋,但是可以作為一個很好的入門案例。項目簡介 本來就是作為一個很小的案例來寫的,包含的功能點也不是那多,索性就按照最最最低配置來搞。能夠顯示聊天消息的聊天區,同時兼顧顯示鏈

        前言

        本次僅記錄 webSocket 與 Swoole 配合打造一個小型的聊天室,功能簡陋,但是可以作為一個很好的入門案例。

        項目簡介

        本來就是作為一個很小的案例來寫的,包含的功能點也不是那多,索性就按照最最最低配置來搞。

      1. 能夠顯示聊天消息的聊天區,同時兼顧顯示鏈接狀態,當前是否連接成功,或者服務端是否斷開連接,而前端不知道的狀況。

      2. 一個輸入框,純粹的輸入框 ?

      3. 點擊按鈕發送不刷新頁面,同時清空當前輸入框內容,就簡單的一個 button 而已,點擊執行,不支持回車發送。

      4. 收到消息,滾動條自動觸底,這個功能在某些使用場景是方便的,但又會造成某些場景使用不方便,方便在于有新消息不需要人工滾動,不方便在于,可能你在看歷史消息,它自動觸底了…還需要根據自己實際需求優化一下下。

      5. 隨機昵稱,當然不需要保存,刷新即丟,在收到消息如果是自己發送的,則顯示 [ 我 ] 在某某時候發送了某某消息,而不是顯示昵稱字符串。

      6. 項目環境

        直接粘貼復制的

        composer create-project topthink/think tpcd tpcomposer require topthink/think-swoole

        因為是測試項目,所有的都是默認安裝,在安裝完之后,訪問前端頁面,使用 view 方法會報錯,百度一下就有解決方案了。

        webSocket 的使用

        參考文檔:https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket

        1. onopen() 發起連接,連接成功后執行。
        2. onclose() 連接斷開后執行。
        3. onmessage() 收到服務端消息后執行。
        4. onerror() 服務器異常執行。
          其實,webSocket 就這些常用方法,也沒啥特殊要求的,他就是作為一個保持連接,接收服務器狀態的一個瀏覽器的 API 存在,非常簡潔方便。

        前端頁面代碼:

        <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>打工人聊天室</title> <!--需要引入jq 文件--></head><style> .content { height: 400px; max-width: 400px; overflow: auto; border-radius: 5px; border: 1px solid #f0f0f0; }</style><body> <div id="content" class="content"> <p>聊天區域</p> </div> 你好打工人:<samp id="nickname">昵稱</samp> <br> 本次連接FD: <samp id="fd-samp"></samp> <br> <input type="text" id="msg"> <input type="hidden" id="fd" value=""> <button id="send" onclick="send()">發送</button></body></html>

        JS 代碼:

        在服務器信息回執時,會有第一次連接回執,還是服務端發送消息回執的狀態區別,通過 msgType 來分辨,如果是第一次連接的回執消息,則把 FD 做一個頁面留存,并不顯示在聊天消息區,如果收到的是消息回執,就直接顯示到聊天消息區。

        還有就是,前后端相互通信發送的東西,都是字符串性質最優,我前端處理的方法是先組合成一個對象,然后轉 JSON 串。

        <script> //滾動條最底部 function scrolltest() { var div = document.getElementById("content"); div.scrollTop = div.scrollHeight; } var wsServer = 'ws://127.0.0.1:9502'; var websocket = new WebSocket(wsServer); var nickname = Math.random().toString(36).substr(2); thisFd = ''; $('#nickname').html(nickname); //點擊發送 function send() { var msg = $('#msg').val(); var data = { 'nickname': nickname, 'fd': thisFd, 'data': msg } //生成json 方便后臺接收以及使用 var data = JSON.stringify(data); websocket.send(data); //然后清空 $('#msg').val(''); } //鏈接成功 websocket.onopen = function (evt) { $("#content >p:last-child").after('<p> 服務器已連接,開始聊天吧 </p>'); }; //鏈接斷開 websocket.onclose = function (evt) { $("#content >p:last-child").after('<p> 服務器已斷開,請重新連接 </p>'); }; //收到服務器消息 websocket.onmessage = function (evt) { //握手成功后,會接受到服務端返回的fd ,msgType = 1 //字符串格式化成json var data = eval('(' + evt.data + ')'); // console.log(evt.data); switch (data.msgType) { case 1: thisFd = data.fd; $('#fd-samp').html(thisFd); $('#fd').val(thisFd); break; case 2: if (data.nickname == nickname) { data.nickname = '我'; } $("#content >p:last-child").after('<p>' + data.nickname + ' 在 ' + data.time + ' 說:<br>' + data.data + '</p>'); //接收到消息自動觸底 scrolltest(); break; } }; //服務器異常 websocket.onerror = function (evt, e) { $("#content >p:last-child").after('<p> 服務器異常 </p>'); };</script>

        服務端代碼
        服務端需要 callback 前端過來的消息,轉成對象數據,然后增加點自定義數據直接原樣返回,并且群發到前端。

        <?php //創建WebSocket Server對象,監聽0.0.0.0:9502端口 $ws = new Swoole\WebSocket\Server('0.0.0.0', 9502); //監聽WebSocket連接打開事件 $ws->on('open', function ($ws, $request){ $fd = $request->fd; $data = json_encode([ 'fd' => $request->fd, 'msgType' => 1 //代表第一次連接,前端處理fd ]); $ws->push($request->fd, $data); }); //監聽WebSocket消息事件 $ws->on('message', function ($ws, $frame) { $stats = $ws->stats(); //格式化接收到json $data = json_decode($frame->data); // 原基礎上不動,增加一些自定義 $data->msgType = 2; //代表服務器端回復 $data->time = date('Y-m-d H-i-s'); $data = json_encode($data); //因為是聊天室,所以包括自己都需要收到回執,就直接群發 swoole 提供 connections 方法 包含了所有在線的 fd foreach ($ws->connections as $conn_fd){ $ws->push($conn_fd,$data); } }); //監聽WebSocket連接關閉事件 $ws->on('close', function ($ws, $fd) {// echo "client-{$fd} is closed\n"; }); $ws->start();

        代碼齊全之后,接下來就只需要在控制臺執行以下 PHP 文件就行。

        然后前臺直接訪問你的網站地址,我的是本地 127.0.0.1

        多開幾個窗口模擬多個用戶,然后發送消息測試即可:

        你好,打工人。

        代碼很簡單,難度不大,但是可以很簡潔的反應出 webScoket 和 Swoole 的一種強大。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        利用webSocket與Swoole打造一個小型聊天室

        利用webSocket與Swoole打造一個小型聊天室:前言 本次僅記錄 webSocket 與 Swoole 配合打造一個小型的聊天室,功能簡陋,但是可以作為一個很好的入門案例。項目簡介 本來就是作為一個很小的案例來寫的,包含的功能點也不是那多,索性就按照最最最低配置來搞。能夠顯示聊天消息的聊天區,同時兼顧顯示鏈
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产vA免费精品高清在线观看| 亚洲人成网站在线观看播放青青| 久久精品免费大片国产大片| 美女裸身网站免费看免费网站| 亚洲精品制服丝袜四区| 免费无码婬片aaa直播表情| 国产特级淫片免费看| 亚洲色图激情文学| 毛片视频免费观看| 色老板亚洲视频免在线观| 手机看黄av免费网址| 亚洲美女自拍视频| 亚洲大片免费观看| 久久亚洲精品成人av无码网站| 精品成人免费自拍视频| 亚洲AV无一区二区三区久久| 亚洲娇小性xxxx色| 国产免费的野战视频| 亚洲va乱码一区二区三区| 两性刺激生活片免费视频| 亚洲激情视频图片| 永久黄网站色视频免费| 色窝窝亚洲AV网在线观看| 亚洲精品成a人在线观看| 亚洲二区在线视频| 毛片视频免费观看| 18禁亚洲深夜福利人口| 亚洲国产精品无码久久青草| 又硬又粗又长又爽免费看| 国产精品免费观看久久| 亚洲午夜无码久久| 亚洲精品线路一在线观看| 久久国产乱子精品免费女| 亚洲美女自拍视频| 永久免费看mv网站入口| av成人免费电影| 亚洲精品亚洲人成在线观看麻豆| 国产乱码免费卡1卡二卡3卡| 亚洲爆乳成av人在线视菜奈实| 亚洲成a人一区二区三区| 亚洲免费人成在线视频观看 |