iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 25
0
自我挑戰組

挑戰30天完成PHP聊天室範例系列 第 25

[Day25]第二十四章-盤古開天(十二)-WEBSOCKET SERVER端(6)

接續上一篇未講個三個自訂函數,
用戶加入或client發送訊息

  function send($k,$msg){
    //將查詢字符串解析到第二個參數變量中,以數組的形式保存如:parse_str("name=Bill&age=60",$arr)
    parse_str($msg,$g);
    $ar=array();

    if($g['type']=='add'){
      //第一次進入添加聊天名字,把姓名保存在相應的users裡面
      $this->users[$k]['name']=$g['ming'];
      $ar['type']='add';
      $ar['name']=$g['ming'];
      $key='all';
    }else{
      //發送訊息行為,其中$g['key']表示面對大家還是個人,是前段傳過來的訊息
      $ar['nrong']=$g['nr'];
      $key=$g['key'];
    }
    //推送信息
    $this->send1($k,$ar,$key);
  }

$k 發訊息人的socketID $key接受人的 socketID ,根據這個socketID可以查找相應的client進息訊息發送,即指定client進行發送

  function send1($k,$ar,$key='all'){
    $ar['code1']=$key;
    $ar['code']=$k;
    $ar['time']=date('m-d H:i:s');
    //對發送訊息進行編碼處理
    $str = $this->code(json_encode($ar));
    //面對家即所有在線者發送訊息
    if($key=='all'){
      $users=$this->users;
      //如果是add表示新加的client
      if($ar['type']=='add'){
        $ar['type']='madd';
        $ar['users']=$this->getusers();    //取出所有在線者,用於顯示在在線用戶列表中
        $str1 = $this->code(json_encode($ar)); //單獨對新client進行編碼處理,數據不一樣
        //對新client自己單獨發送,因為有些數據是不一樣的
        socket_write($users[$k]['socket'],$str1,strlen($str1));
        //上面已經對client自己單獨發送的,後面就無需再次發送,故unset
        unset($users[$k]);
      }
      //除了新client外,對其他client進行發送訊息。數據量大時,就要考慮延時等問題了
      foreach($users as $v){
        socket_write($v['socket'],$str,strlen($str));
      }
    }else{
      //單獨對個人發送訊息,即雙方聊天
      socket_write($this->users[$k]['socket'],$str,strlen($str));
      socket_write($this->users[$key]['socket'],$str,strlen($str));
    }
  }

用戶退出向所用client推送訊息

  function send2($k){
    $this->close($k);
    $ar['type']='rmove';
    $ar['nrong']=$k;
    $this->send1(false,$ar,'all');
  } 

下一篇組裝一下這4個自訂函數。


上一篇
[Day24]第二十三章-盤古開天(十一)-WEBSOCKET SERVER端(5)
下一篇
[Day26]第二十五章-盤古開天(十三)-WEBSOCKET SERVER端(7)
系列文
挑戰30天完成PHP聊天室範例30

尚未有邦友留言

立即登入留言