• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答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 配合打造一個小型的聊天室,功能簡陋,但是可以作為一個很好的入門案例。

    項目簡介

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

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

  • 一個輸入框,純粹的輸入框 ?

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

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

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

  • 項目環境

    直接粘貼復制的

    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
    主站蜘蛛池模板: 亚洲精品无码精品mV在线观看| 久久亚洲国产精品一区二区 | 久久青草国产精品一区| 中日精品无码一本二本三本| 一本色道久久88—综合亚洲精品| 亚洲欧洲久久久精品| 91午夜精品亚洲一区二区三区| 黑人无码精品又粗又大又长| 亚洲国产一成久久精品国产成人综合| 久久这里只有精品视频99| 中文无码精品一区二区三区| 国产精品婷婷午夜在线观看| 亚洲A∨午夜成人片精品网站| 99久久国产热无码精品免费| 99久久精品国产综合一区 | 欧洲成人午夜精品无码区久久| 久久国产热精品波多野结衣AV| 成人伊人精品色XXXX视频| 亚洲国产成人精品91久久久| 久久99精品久久久久久9蜜桃| 手机日韩精品视频在线看网站| 伊人久久精品无码二区麻豆| 精品国产毛片一区二区无码| 亚洲综合国产精品| 亚洲欧洲久久久精品| 欧美人与性动交α欧美精品成人色XXXX视频 | 久久亚洲国产欧洲精品一| 亚洲中文字幕久久精品无码APP | 国产亚洲精品激情都市| 中文字幕一区二区精品区| 久久99国产精品久久99果冻传媒| 欧美亚洲精品在线| 99国产精品无码| 99久久er这里只有精品18| 国产成人精品午夜福利| 黑人巨茎精品欧美一区二区| 国产精品人人做人人爽| 久久永久免费人妻精品下载| 亚洲处破女AV日韩精品| 亚洲精品无码久久千人斩| 亚洲国产精品无码中文字|