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

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

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

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

首先,定義一個 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)有客戶端鏈接時,簡單記錄客戶端的信息。

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ā)送信息時,對信息進(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;  、

      // 記錄每個鏈接的信息,同樣不要嘗試打印出來看,因為你只能看到自己的鏈接信息
          $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)時用 foreach 去循環(huán)時,它確實有用。)
      foreach ($this->server->connections as $fd) {
        $this->server->push($fd, json_encode($message));
      }
      $server->finish( 'Task' . $task_id . 'Finished' . PHP_EOL);
    }

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

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ù)器連接錯誤,請稍后重試');
    };
    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)站聲明】本站除付費源碼經(jīng)過測試外,其他素材未做測試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請勿用于商業(yè)用途。如損害你的權(quán)益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要給大家介紹了關(guān)于利用swoole+redis實現(xiàn)股票和區(qū)塊鏈服務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下
本文給大家介紹的是一次比較特殊的任務(wù),我們使用PHP SWOOLE 做一個異步的定時任務(wù)系統(tǒng),具體如何來實現(xiàn)的呢,接下來來我們好好看下吧
主站蜘蛛池模板: 狠狠涩| 国产精品视频久久久 | av网站免费观看 | 久久精品国产99国产精品 | 天堂成人国产精品一区 | 亚洲精品免费视频 | 欧美成人h版在线观看 | 中文在线日韩 | 久草免费视 | 羞羞视频在线观看 | 久久久久久九九九九九九 | 性一交一乱一透一a级 | 国产精品99999999 | 日韩伦理一区二区 | 最新国产在线 | 日韩在线小视频 | 国产精品自拍视频网站 | 日韩精品一区二区三区视频播放 | a级黄色片视频 | 亚洲视频一区二区三区 | 国产一区二区精品在线 | 九热在线 | 色婷婷av一区二区三区软件 | 亚洲久久久 | 欧美精品网站 | 欧美成人免费在线 | 91精品国产色综合久久不卡蜜臀 | 欧美一级黄 | 亚洲成人av在线播放 | 成人影院在线 | 久久久91 | 日韩欧美三级 | 欧美一区二区精品 | 18av在线播放 | 日韩一及片 | 亚洲高清视频一区二区 | 色播视频在线观看 | 免费观看黄a一级视频 | 久久久国产一区 | 成人毛片网 | 国产免费视频 |