接續上一篇未講個三個自訂函數,
用戶加入或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個自訂函數。