iT邦幫忙

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

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

[Day26]第二十五章-盤古開天(十三)-WEBSOCKET SERVER端(7)

我們來組裝一下在處理訊息時的4個自訂函數~

//對創建的socket循環進行監聽,處理數據
function run(){
    //循環,直到socket斷開
    while(true){
         socket_select($changes,$write,$except,NULL);
         //循環取client傳過來的資料
         foreach($changes as $sock){
             //如果有新的client連接進來,則
            if($sock==$this->master){
              //接受一個socket連接
              $client=socket_accept($this->master);
              //给新連接進來的socket一個唯一的ID
              $key=uniqid();
              $this->sockets[]=$client; //將新連接進來的socket存進連接池
              $this->users[$key]=array(
              'socket'=>$client, //紀錄新連接進來client的socket訊息
              'shou'=>false    //標記該socket資源沒有完成握手
          );
            }else{
              $len=0;
              $buffer='';
              //讀取該socket的訊息,注意:第二個參數是引用傳參即接收數據,第三個參數是接收數據的長度
              do{
                $l=socket_recv($sock,$buf,1000,0);
                $len+=$l;
                $buffer.=$buf;
              }while($l==1000);

              //根據socket在user池裡面查找相應的$k,即ID
              $k=$this->search($sock);
              //如果接收的訊息長度小於7,則該client的socket為斷開連接
              
              if($len<7){
                  //给該client的socket進行斷開操作,並在$this->sockets和$this->users裡面進行删除
                  $this->send2($k);
                  continue;
              }
              //判断該socket是否已經握手
              if(!$this->users[$k]['shou']){
              //如果沒有握手,則進行握手處理
              $this->woshou($k,$buffer);
              }else{
              //走到這裡就是該client發送訊息了,對接受到的訊息進行uncode處理
              $buffer = $this->uncode($buffer,$k);
              if($buffer==false){
                  continue;
              }
              //如果不為空,則進行消息推送操作
              $this->send($k,$buffer);
              }
            }
         }
    }
}

這樣我們的server端就差不多完成了,剩下關閉socket連線的部分,
在send2的時候我們有呼叫到一個自訂函數

//指定關閉$k對應的socket
  function close($k){
    //斷開相應socket
    socket_close($this->users[$k]['socket']);
    //删除相應的user訊息
    unset($this->users[$k]);
    //重新定義sockets連接池
    $this->sockets=array($this->master);
    foreach($this->users as $v){
      $this->sockets[]=$v['socket'];
    }

  }

SERVER端告一段落囉,下一篇開始講client的處理~感謝各位不離不棄~


上一篇
[Day25]第二十四章-盤古開天(十二)-WEBSOCKET SERVER端(6)
下一篇
[Day27]第二十六章-盤古開天(十四)-WEBSOCKET Client端(1)
系列文
挑戰30天完成PHP聊天室範例30

尚未有邦友留言

立即登入留言