pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

swoole和websocket簡單聊天室開發(fā)

這篇文章主要為大家詳細(xì)介紹了swoole和websocket簡單聊天室開發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

首先,我想說下寫代碼的一些習(xí)慣,第一,任何可配置的參數(shù)或變量都要寫到一個(gè)config文件中。第二,代碼中一定要有日志記錄和完善的報(bào)錯(cuò)并記錄報(bào)錯(cuò)。言歸正傳,swoole應(yīng)該是每個(gè)phper必須要了解的,它號稱重新定義了php。此聊天室利用了swoole高并發(fā)并且異步非阻塞的特點(diǎn)提高了程序的性能。

首先,定義一個(gè) swoole_lock swoole_websocket_server ,并且配置參數(shù),具體參數(shù)詳情可以去swoole官網(wǎng)查看。

public function start()
{
   $this->lock = new swoole_lock(SWOOLE_MUTEX);            

   // 對文件或數(shù)組進(jìn)行鎖操作,已達(dá)到同步
   $this->server = new swoole_websocket_server($this->addr, $this->port);  

   // swoole提供的Websocket Server
   $this->server->set(array(
      'daemonize' => 0,
      'worker_num' => 4,
      'task_worker_num' => 10,
      'max_request' => 1000,
      'log_file' => ROOT_PATH . 'storage\\logs\\swoole.log'   

    // swoole日志路徑,必須是絕對路徑
   ));

   $this->server->on('open', array($this, 'onOpen'));
   $this->server->on('message', array($this, 'onMessage'));
   $this->server->on('task', array($this, 'onTask'));
   $this->server->on('finish', array($this, 'onFinish'));
   $this->server->on('close', array($this, 'onClose'));

   // 啟動服務(wù)
   $this->server->start();
}

當(dāng)有客戶端鏈接時(shí),簡單記錄客戶端的信息。

public function onOpen($server, $request)
    {
      $message = array(
        'remote_addr' => $request->server['remote_addr'],
        'request_time' => date('Y-m-d H:i:s', $request->server['request_time'])
      );
      write_log($message);
    }

當(dāng)有客戶端發(fā)送信息時(shí),對信息進(jìn)行處理。

public function onMessage($server, $frame)
    {
      $data = json_decode($frame->data);

      switch ($data->type) {
        case 'init':
        case 'INIT':
          $this->users[$frame->fd] = $data->message;  、

      // 記錄每個(gè)鏈接的信息,同樣不要嘗試打印出來看,因?yàn)槟阒荒芸吹阶约旱逆溄有畔?
          $message = '歡迎' . $data->message . '加入了聊天室';
          $response = array(
            'type' => 1,  // 1代表系統(tǒng)消息,2代表用戶聊天
            'message' => $message
          );
          break;
        case 'chat':
        case 'CHAT':
          $message = $data->message;
          $response = array(
            'type' => 2,  // 1代表系統(tǒng)消息,2代表用戶聊天
            'username' => $this->users[$frame->fd],
            'message' => $message
          );
          break;
        default:
          return false;
      }
        
       // 將信息交給task處理
      $this->server->task($response);
    }

    public function onTask($server, $task_id, $from_id, $message)
    {
       // 迭代所有的客戶端鏈接,將消息推送過去。(如果你嘗試將 $this->server->connections 打印出來,那么你會發(fā)現(xiàn)他是空的。但當(dāng)時(shí)用 foreach 去循環(huán)時(shí),它確實(shí)有用。)
      foreach ($this->server->connections as $fd) {
        $this->server->push($fd, json_encode($message));
      }
      $server->finish( 'Task' . $task_id . 'Finished' . PHP_EOL);
    }

最后,當(dāng)客戶端斷開鏈接時(shí),利用鎖機(jī)制,同步刪除客戶端信息,并記錄日志。

public function onClose($server, $fd)
    {
      $username = $this->users[$fd];
      // 釋放客戶端,利用鎖進(jìn)行同步
      $this->lock->lock();
      unset($this->users[$fd]);
      $this->lock->unlock();

      if( $username ) {
        $response = array(
          'type' => 1,  // 1代表系統(tǒng)消息,2代表用戶聊天
          'message' => $username . '離開了聊天室'
        );
        $this->server->task($response);
      }


      write_log( $fd . ' disconnected');
    }

服務(wù)端完了,下面就是客戶端,很簡單,只需要用websocket鏈接就ok!

// websocket
    let address = 'ws://<?php echo CLIENT_CONNECT_ADDR . ':' . CLIENT_CONNECT_PORT ?>';
    let webSocket = new WebSocket(address);
    webSocket.onerror = function (event) {
      alert('服務(wù)器連接錯(cuò)誤,請稍后重試');
    };
    webSocket.onopen = function (event) {
      if(!sessionStorage.getItem('username')) {
        setName();
      }else {
        username = sessionStorage.getItem('username')
        webSocket.send(JSON.stringify({
          'message': username,
          'type': 'init'
        }));
      }
    };
    webSocket.onmessage = function (event) {
      console.log(event);
      let data = JSON.parse(event.data);
      if (data.type == 1) {
        $('#chat-list2').append('<li class="ui-border-tb"><span class="username">系統(tǒng)消息:</span><span class="message">' + data.message + '</span></li>');
      } else if (data.type == 2) {
        $('#chat-list2').append('<li class="ui-border-tb"><span class="username">' + data.username + ':</span><span class="message">' + data.message + '</span></li>');
      }

    };
    webSocket.onclose = function (event) {
      alert('散了吧,服務(wù)器都關(guān)了');
    };

詳細(xì)代碼可以去我的github下載

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持。

【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過測試外,其他素材未做測試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請勿用于商業(yè)用途。如損害你的權(quán)益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要給大家介紹了關(guān)于利用swoole+redis實(shí)現(xiàn)股票和區(qū)塊鏈服務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下
本文給大家介紹的是一次比較特殊的任務(wù),我們使用PHP SWOOLE 做一個(gè)異步的定時(shí)任務(wù)系統(tǒng),具體如何來實(shí)現(xiàn)的呢,接下來來我們好好看下吧
主站蜘蛛池模板: 优考试_免费在线考试系统_培训考试系统_题库系统_组卷答题系统_匡优考试 | 重庆小面培训_重庆小面技术培训学习班哪家好【终身免费复学】 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 | 移动厕所租赁|移动卫生间|上海移动厕所租赁-家瑞租赁 | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | 特种电缆厂家-硅橡胶耐高温电缆-耐低温补偿导线-安徽万邦特种电缆有限公司 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | 磁力抛光机_磁力研磨机_磁力去毛刺机-冠古设备厂家|维修|租赁【官网】 | 冰雕-冰雪世界-大型冰雕展制作公司-赛北冰雕官网 | 电动葫芦-河北悍象起重机械有限公司 | 德国EA可编程直流电源_电子负载,中国台湾固纬直流电源_交流电源-苏州展文电子科技有限公司 | 祝融环境-地源热泵多恒系统高新技术企业,舒适生活环境缔造者! | 新疆十佳旅行社_新疆旅游报价_新疆自驾跟团游-新疆中西部国际旅行社 | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | 软装设计-提供软装装饰和软装配饰及软装陈设的软装设计公司 | 砖机托板价格|免烧砖托板|空心砖托板厂家_山东宏升砖机托板厂 | 双相钢_双相不锈钢_双相钢圆钢棒_双相不锈钢报价「海新双相钢」 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | 单机除尘器 骨架-脉冲除尘器设备生产厂家-润天环保设备 | 便民信息网_家电维修,家电清洗,开锁换锁,本地家政公司 | FAG轴承,苏州FAG轴承,德国FAG轴承-恩梯必传动设备(苏州)有限公司 | 油液红外光谱仪-油液监测系统-燃油嗅探仪-上海冉超光电科技有限公司 | 托盘租赁_塑料托盘租赁_托盘出租_栈板出租_青岛托盘租赁-优胜必达 | 北京翻译公司_同传翻译_字幕翻译_合同翻译_英语陪同翻译_影视翻译_翻译盖章-译铭信息 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 回收二手冲床_金丰旧冲床回收_协易冲床回收 - 大鑫机械设备 | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | DWS物流设备_扫码称重量方一体机_快递包裹分拣机_广东高臻智能装备有限公司 | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | 浙江寺庙设计-杭州寺院设计-宁波寺庙规划_汉匠 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 列管冷凝器,刮板蒸发器,外盘管反应釜厂家-无锡曼旺化工设备有限公司 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 上海logo设计| 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | 成都顶呱呱信息技术有限公司-贷款_个人贷款_银行贷款在线申请 - 成都贷款公司 | 泉州陶瓷pc砖_园林景观砖厂家_石英砖地铺石价格 _福建暴风石英砖 | 新车测评网_网罗汽车评测资讯_汽车评测门户报道 | 冷库安装厂家_杭州冷库_保鲜库建设-浙江克冷制冷设备有限公司 |