在用户订阅之后,我们就可以给用户发消息了,只要有用户向服务器发送了消息,就推送给其他所有用户。
首先,我们需要在messageController中判断用户发送消息的类型,即 type=message.
然后我们需要拼凑消息的数组,使用上一节中的数组即可。
最后,我们通过之前定义的给所有用户发消息的方法,来将消息发送到所有用户,就可以了。
具体代码如下:
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;
我们依然需要一个入库和过滤的操作,这个操作可以在getMessageContent这个方法中给出。
<?php
namespace app\services;
use pool\pool;
use services\UploadService;
use Swoole\Mysql\Exception;
/**
* 消息类,所有的消息都在这里处理
* Class MessageService
* @package app\services
*/
class MessageService extends CommonService
{
public function getMessageContent($params, $isComeIn = 0)
{
if($isComeIn==0){
$msg_content="xxx进入了房间";
}else{
//TODO 消息敏感词过滤
//TODO 消息入库
$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'],
];
}
}
然后我们可以测试一下收发消息的能力:
测试消息的结构体为:
{
"type":"message",
"first_topic" :1,
"second_topic" :1,
"msg_type" :0,
"msg_content" : "你好",
"user_id" :1
}
我们在10086和10087两个用户都订阅以后,用10086的用户发送消息,可以看到
10086.png 10087.png当前组中的所有用户都已经收到了消息。
因此,这个聊天室就算完成了。
网友评论