在用戶(hù)訂閱之后,我們就可以給用戶(hù)發(fā)消息了,只要有用戶(hù)向服務(wù)器發(fā)送了消息,就推送給其他所有用戶(hù)。
首先,我們需要在messageController中判斷用戶(hù)發(fā)送消息的類(lèi)型,即 type=message.
然后我們需要拼湊消息的數(shù)組,使用上一節(jié)中的數(shù)組即可。
最后,我們通過(guò)之前定義的給所有用戶(hù)發(fā)消息的方法,來(lái)將消息發(fā)送到所有用戶(hù),就可以了。
具體代碼如下:
case 'message':
$msgService=new MessageService();
$data=$msgService->getMessageContent($data,1);
$fds = UserService::getFdByGroup($data['first_topic'], $data['second_topic']);
$pushToAll=new PushToAllMessage($this->server,$data,$fds);
$msgService->addPushObServer($pushToAll);
$msgService->notify();
break;
我們依然需要一個(gè)入庫(kù)和過(guò)濾的操作,這個(gè)操作可以在getMessageContent這個(gè)方法中給出。
<?php
namespace app\services;
use pool\pool;
use services\UploadService;
use Swoole\Mysql\Exception;
/**
* 消息類(lèi),所有的消息都在這里處理
* Class MessageService
* @package app\services
*/
class MessageService extends CommonService
{
public function getMessageContent($params, $isComeIn = 0)
{
if($isComeIn==0){
$msg_content="xxx進(jìn)入了房間";
}else{
//TODO 消息敏感詞過(guò)濾
//TODO 消息入庫(kù)
$msg_content=$params['msg_content'];
}
return [
'first_topic' => $params['first_topic'],
'second_topic' => $params['second_topic'],
'msg_type' => 0,
'msg_content' => $msg_content,
'user_id' => $params['user_id'],
];
}
}
然后我們可以測(cè)試一下收發(fā)消息的能力:
測(cè)試消息的結(jié)構(gòu)體為:
{
"type":"message",
"first_topic" :1,
"second_topic" :1,
"msg_type" :0,
"msg_content" : "你好",
"user_id" :1
}
我們?cè)?0086和10087兩個(gè)用戶(hù)都訂閱以后,用10086的用戶(hù)發(fā)送消息,可以看到

10086.png

10087.png
當(dāng)前組中的所有用戶(hù)都已經(jīng)收到了消息。
因此,這個(gè)聊天室就算完成了。