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)的呢,接下來來我們好好看下吧
主站蜘蛛池模板: 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 液氮罐_液氮容器_自增压液氮罐_杜瓦瓶_班德液氮罐厂家 | 设定时间记录电子秤-自动累计储存电子秤-昆山巨天仪器设备有限公司 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 十二星座查询(性格特点分析、星座运势解读) - 玄米星座网 | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 超声骨密度仪-动脉硬化检测仪器-人体成分分析仪厂家/品牌/价格_南京科力悦 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 建大仁科-温湿度变送器|温湿度传感器|温湿度记录仪_厂家_价格-山东仁科 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 我车网|我关心的汽车资讯_汽车图片_汽车生活! | ptc_浴霸_大巴_干衣机_呼吸机_毛巾架_电动车加热器-上海帕克 | 四探针电阻率测试仪-振实密度仪-粉末流动性测定仪-宁波瑞柯微智能 | POS机办理_个人pos机免费领取-银联pos机申请首页 | 石栏杆_青石栏杆_汉白玉栏杆_花岗岩栏杆 - 【石雕之乡】点石石雕石材厂 | 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | 河南档案架,档案密集架,手动密集架,河南密集架批发/报价 | 纸塑分离机-纸塑分离清洗机设备-压力筛-碎浆机厂家金双联环保 | 衬塑设备,衬四氟设备,衬氟设备-淄博鲲鹏防腐设备有限公司 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 猪I型/II型胶原-五克隆合剂-细胞冻存培养基-北京博蕾德科技发展有限公司 | 红外光谱仪维修_二手红外光谱仪_红外压片机_红外附件-天津博精仪器 | 整合营销推广|营销网络推广公司|石家庄网站优化推广公司|智营销 好物生环保网、环保论坛 - 环保人的学习交流平台 | 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, | 罐体电伴热工程-消防管道电伴热带厂家-山东沃安电气 | 南京办公用品网-办公文具用品批发-打印机耗材采购 | 森旺-A级防火板_石英纤维板_不燃抗菌板装饰板_医疗板 | 至顶网 | 生物制药洁净车间-GMP车间净化工程-食品净化厂房-杭州波涛净化设备工程有限公司 | 亳州网络公司 - 亳州网站制作 - 亳州网站建设 - 亳州易天科技 | 斗式提升机,斗式提升机厂家-淄博宏建机械有限公司 | 电地暖-电采暖-发热膜-石墨烯电热膜品牌加盟-暖季地暖厂家 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 密集架-手摇-智能-移动-价格_内蒙古档案密集架生产厂家 | 空压机商城|空气压缩机|空压机配件-压缩机网旗下商城 | 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 精密冲床,高速冲床等冲压设备生产商-常州晋志德压力机厂 |