getwayworker长连接下的普通文本消息之聊天记录持久化

针对课程:getwayworker长连接下的普通文本消息之聊天记录持久化
https://study.163.com/course/courseLearn.htm?courseId=1005015012#/learn/video?lessonId=1051351979&courseId=1005015012

1.判断用户是否在线
在events.php中:

public static function onMessage($client_id, $message){

$message_data = json_decode($message,true);//把json数据转换成数组

//判断msg数据是否存在
if(!$message_data){
return;
}

switch($message_data['type']){

case "bind":
$fromid = $message_data['fromid'];
Gateway::bindUid($client_id,$fromid);//客户端id与fromid绑定
retrun;

case "say":
var text =nl2br(htmlspecialchars($message_data['data']));
var fromid = $message_data['fromid'];
var toid = $message_data['toid'];

//组装一套要发送给客户端的数据:
 $data = [
'type'=>'text',
'id'=>$client_id,//可选
'data'=>$text,
'from'=>$fromid,
'toid' =>$toid,
'time'=>time()
];

//判断用户的在线情况:
if(Gateway::isUidOnline($toid)){
Gateway::sendToUid($toid,json_encode($data));//将已组装好的数据,发送给已绑定的uid客户端,将数组转换成json发给客户端
$data['isread']=1;
}else{
$data['isread']=0;
}
$data['type']="save";

Gateway::sendToUid($fromid,json_encode($data));
retrun;
}
}

前端页面:

客户端接收到events.php发送过来的数据,进行处理:

var fromid = {$fromid};
var toid = {$toid};
var API_URL = "/api/chat/";
ws.onmessage = function(e){
var  message = eval("("+e.data+")"); //将客户端收到的json转换成js数据
switch(message.type){
case "init":
var bind = '{"type":'bind',"fromid":"'+fromid+'"}';
ws.send(bind);
ruturn;

case "text":

if(toid==message.fromid){
$(".chat-content").append('<div>'+message.data+'</div>');
}
retrun;

case "save":
save_message(message);
return;

}
}

function save_message(message){
$.post(
API_URL+"save_message",
message,
function(){},'json'
)
}

API模块下,Chat控制器:

namespace app\api\controller;

class Chat extends Controller{

/*文本消息的数据持久化*/
public function save_message(){
if(Request::instance()->isAjax()){
$message = input("post.");
$datas['fromid'] = $message['fromid'];
$datas['fromname'] =$this->getName($datas['fromid']) ;
$datas['toid'] = $message['toid'];
$datas['toname'] =$this->getName($datas['toid']) ;
$datas['content'] = $message['data'];
$datas['time'] = $message['time'];
$datas['isread'] = $message['isread'];
$datas['type'] = 1 ;//文本为1,图片为2
Db::name("communication")->insert($datas);

}
}


/*根据用户id,返回用户的姓名*/
public function getName($uid){
$userinfo = Db::name("user")->where('id',$uid)->field('nickname')->find();
return $userinfo['nickname'];

}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值