久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

swoole和websocket簡單聊天室開發

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

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

首先,定義一個 swoole_lock swoole_websocket_server ,并且配置參數,具體參數詳情可以去swoole官網查看。

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

   // 對文件或數組進行鎖操作,已達到同步
   $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'));

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

當有客戶端鏈接時,簡單記錄客戶端的信息。

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);
    }

當有客戶端發送信息時,對信息進行處理。

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

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

      // 記錄每個鏈接的信息,同樣不要嘗試打印出來看,因為你只能看到自己的鏈接信息
          $message = '歡迎' . $data->message . '加入了聊天室';
          $response = array(
            'type' => 1,  // 1代表系統消息,2代表用戶聊天
            'message' => $message
          );
          break;
        case 'chat':
        case 'CHAT':
          $message = $data->message;
          $response = array(
            'type' => 2,  // 1代表系統消息,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 打印出來,那么你會發現他是空的。但當時用 foreach 去循環時,它確實有用。)
      foreach ($this->server->connections as $fd) {
        $this->server->push($fd, json_encode($message));
      }
      $server->finish( 'Task' . $task_id . 'Finished' . PHP_EOL);
    }

最后,當客戶端斷開鏈接時,利用鎖機制,同步刪除客戶端信息,并記錄日志。

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

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


      write_log( $fd . ' disconnected');
    }

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

// websocket
    let address = 'ws://<?php echo CLIENT_CONNECT_ADDR . ':' . CLIENT_CONNECT_PORT ?>';
    let webSocket = new WebSocket(address);
    webSocket.onerror = function (event) {
      alert('服務器連接錯誤,請稍后重試');
    };
    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">系統消息:</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('散了吧,服務器都關了');
    };

詳細代碼可以去我的github下載

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要給大家介紹了關于利用swoole+redis實現股票和區塊鏈服務的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下
本文給大家介紹的是一次比較特殊的任務,我們使用PHP SWOOLE 做一個異步的定時任務系統,具體如何來實現的呢,接下來來我們好好看下吧
主站蜘蛛池模板: 国产成年人小视频 | 久久久久久免费精品一区二区三区 | 日韩中文字幕第一页 | 精品久久久久香蕉网 | 久久精品国产一区二区电影 | 国产精品一区久久久 | 国内精品视频一区二区三区 | 亚洲网站免费看 | 波多野结衣中文字幕一区二区三区 | 婷婷精品 | www.97国产| av免费网址| 色悠悠久| 国产精品日韩在线 | 少妇性l交大片免费一 | 久久夜色精品国产 | 亚洲性网 | 黄色片大全在线观看 | 成人精品网| 精品成人69xx.xyz | 国产综合久久久久久鬼色 | 亚洲欧洲精品成人久久奇米网 | 在线观看中文字幕 | 91精品国产一区二区三区 | 日韩精品视频一区二区三区 | 91美女在线观看 | 亚洲狠狠爱 | 中文字幕一区二区三区四区 | 特级做a爰片毛片免费看108 | 成人精品视频在线观看 | 日本三级电影在线免费观看 | 免费在线观看一区二区三区 | 一道本不卡视频 | 免费观看成人av | 天天操网 | 久久久久无码国产精品一区 | 盗摄精品av一区二区三区 | 色婷婷av777 av免费网站在线 | 国产精品久久精品 | 一区二区福利视频 | 欧美成人综合 |