久久久久久久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 做一個異步的定時任務系統,具體如何來實現的呢,接下來來我們好好看下吧
主站蜘蛛池模板: 国产午夜精品一区二区三区 | 午夜影院在线观看视频 | 成人精品一区亚洲午夜久久久 | 黄色网址免费看 | 精品在线看 | 蜜臀久久 | 国产精品永久在线观看 | 四虎海外 | 色婷婷av777| 自拍视频一区二区三区 | 久久精品免费看 | 色.com| 精品一区二区三区在线观看 | 超碰成人免费观看 | 日韩av免费在线观看 | av中文字幕在线观看 | 国产精品视频久久久 | 久久精品一区二区三区四区 | 激情久久网 | 亚洲视频在线看 | 国产丝袜一区二区三区免费视频 | 超碰97免费 | 日本福利视频免费观看 | 亚洲成人中文字幕 | 日韩三级一区 | 国产伦精品一区二区三区视频金莲 | 亚洲国产成人在线观看 | 国产精品区一区二区三区 | 中国xxxx性xxxx产国 | 日韩精品久久久久久 | 欧洲色| 亚洲天堂免费 | 午夜精品一区二区三区在线视频 | 国产欧美日韩一区 | 国产精品日韩欧美一区二区三区 | 免费观看国产视频在线 | www网站在线观看 | 99亚洲综合 | 精品国产免费一区二区三区演员表 | av毛片| 国产精品一区二区三区在线 |