我們來組裝一下在處理訊息時的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的處理~感謝各位不離不棄~