日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

workerman实现聊天室

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 workerman实现聊天室 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Workerman的一些應用方向如下

  • 即時通訊類 例如網頁即時聊天、即時消息推送、微信小程序、手機app消息推送、PC軟件消息推送等等
  • 物聯網類 例如Workerman與打印機通訊、與單片機通訊、智能手環、智能家居、共享單車等等。
  • 游戲服務器類
  • SOA服務化 利用Workerman將現有業務不同功能單元封裝起來,以服務的形式對外提供統一的接口,達到系統松耦合、易維護、高可用、易伸縮。[示例 workerman-json-rpc、 workerman-thrift]
  • 其它服務器軟件 例如 GatewayWorker,PHPSocket.IO,http代理,sock5代理,分布式通訊組件,分布式變量共享組件,消息隊列、DNS服務器、WebServer、CDN服務器、FTP服務器等等
  • 中間件 例如異步MySQL組件,異步redis組件,異步http組件,異步消息隊列組件,異步dns組件,文件監控組件,還有很多第三方開發的組件框架等等 原理: worker是workweman中的基本容器,每個worker都可以開啟多個進程監聽端口并使用特定的協議通訊,類似nginx監聽端口;每個Worker進程獨立運作,采用Epoll(需要裝event擴展)+非阻塞IO,每個Worker進程都能做上萬的客戶端連接,并處理這些連接上發來的數據。主進程為了保持穩定性,只負責監控子進程,不負責接收數據也不做任何業務邏輯。
  • 現在我們就可以做一個聊天室,關鍵代碼如下:

    <?php /*** Created by PhpStorm.* User: John* Date: 2019/4/3* Time: 13:19*/use Workerman\Worker;require __DIR__.'/../Workerman-framework/Autoloader.php';// 當客戶端連上來時分配uid,并保存連接,并通知所有客戶端 function handle_connection($connection) {}// 當客戶端發送消息過來時,轉發給所有人 function handle_message($connection, $data) {global $text_worker;foreach($text_worker->connections as $conn){$conn->send($data);} }// 當客戶端斷開時,廣播給所有客戶端 function handle_close($connection) {}// 創建一個文本協議的Worker監聽2347接口 $text_worker = new Worker("websocket://0.0.0.0:2347");// 只啟動1個進程,這樣方便客戶端之間傳輸數據 $text_worker->count = 1;$text_worker->onConnect = 'handle_connection'; $text_worker->onMessage = 'handle_message'; $text_worker->onClose = 'handle_close';Worker::runAll(); 復制代碼

    前端代碼如下

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <div style="margin: 0 auto;width: 800px"><h2>聊天室</h2><textarea type="text" style="border: 1px solid black;width: 800px;height: 200px;" id="his"></textarea><input type="text" style="width:740px" id="sendMsg">&nbsp;<button id="send">發送</button> </div> </body> </html> <script src="http://code.jquery.com/jquery-latest.js"></script> <script>$(function () {var ws = new WebSocket("ws://127.0.0.1:2347");var storage = window.localStorage;if(!storage.getItem('name')){var name=prompt("請輸入您的名字","");storage.setItem('name',name);}$('#send').click(function () {msg = $('#sendMsg').val();$('#sendMsg').val('');ws.send(storage.getItem('name')+':'+msg);});ws.onopen = function() {$('#his').append("服務器連接成功.....");$('#his').append("\n");};ws.onmessage = function(e) {$('#his').append(e.data);$('#his').append("\n");};}); </script> 復制代碼

    咱們這里使用了websocket協議,打開頁面即建立一個連接;

    解釋下php代碼

    onConnet就是連接時完成三次握手時,執行的觸發動作;$connection是連接對象;

    onMessage是當客戶端通過連接發來數據時(Workerman收到數據時)觸發的回調函數;data是對應協議decode(解碼)了的數據;$connection是連接對象

    onClose當客戶端連接與Workerman斷開時觸發的回調函數。不管連接是如何斷開的,只要斷開就會觸發onClose。每個連接只會觸發一次onClose(注意:這里的斷開指的是關閉瀏覽器,不是斷網;斷網的話需要做心跳檢測來判斷)

    代碼傳送門(github.com/BoHongtao/W…)

    示例demo(github.com/BoHongtao/W…)

    轉載于:https://juejin.im/post/5caae542e51d452b084af4b4

    總結

    以上是生活随笔為你收集整理的workerman实现聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。