前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Workerman之GatewayWorker框架 - 在线客服,实时通信

Workerman之GatewayWorker框架 - 在线客服,实时通信

作者头像
唐成勇
发布2019-05-26 20:04:46
1.2K0
发布2019-05-26 20:04:46
举报
文章被收录于专栏:唐成勇唐成勇

一、绑定用户id实现一对一客服聊天

相关文档:LibGateway类提供的接口

JS:

代码语言:javascript
复制
<script>

    var fromid = {$fromid};

    var toid = {$toid};

     var ws =  new WebSocket("ws://127.0.0.1:8282");

      ws.onmessage = function(e){

       var message =  eval("("+e.data+")");
          switch (message.type){
              case "init":
                  var bild = '{"type":"bind","fromid":"'+fromid+'"}';
                   ws.send(bild);
                  return;
              case "text":
                  $(".chat-content").append(' <div class="chat-text section-left flex"><span class="char-img" style="background-image: url(http://chat.com/static/newcj/img/123.jpg)"></span> <span class="text"><i class="icon icon-sanjiao4 t-32"></i>'+message.data+'</span> </div>');
                  return;
          }
    }

     $(".send-btn").click(function(){

         var text = $(".send-input").val();

         var message = '{"data":"'+text+'","type":"say","fromid":"'+fromid+'","toid":"'+toid+'"}';

         $(".chat-content").append('<div class="chat-text section-right flex"><span class="text"><i class="icon icon-sanjiao3 t-32"></i>'+text+'</span> <span class="char-img" style="background-image: url(http://chat.com/static/newcj/img/132.jpg)"></span> </div>');

         ws.send(message);

         $(".send-input").val("");
     })

</script>
clipboard.png
clipboard.png
代码语言:javascript
复制
/**
     * 当客户端连接时触发
     * 如果业务不需此回调可以删除onConnect
     * 
     * @param int $client_id 连接id
     */
    public static function onConnect($client_id)
    {
        global $num;
        // 向当前client_id发送数据
        //Gateway::sendToClient($client_id, "Hello $client_id\r\n");
        // 向所有人发送
       // Gateway::sendToAll("$client_id login\r\n");

        echo "connect".++$num.":".$client_id."\n";

        Gateway::sendToClient($client_id,json_encode([
           'type'=>'init',
           'client_id'=>$client_id
       ]));

    }
    
   /**
    * 当客户端发来消息时触发
    * @param int $client_id 连接id
    * @param mixed $message 具体消息
    */
   public static function onMessage($client_id, $message)
   {
       $message_data = json_decode($message,true);
       if(!$message_data){
           return;
       }
       switch($message_data['type']){
           case "bind":
               $fromid = $message_data['fromid'];
               Gateway::bindUid($client_id, $fromid);
               return;
           case "say":

               $text = nl2br(htmlspecialchars($message_data['data']));
               $fromid = $message_data['fromid'];
               $toid = $message_data['toid'];

               $date=[
                   'type'=>'text',
                   'data'=>$text,
                   'fromid'=>$fromid,
                   'toid'=>$toid,
                   'time'=>time()
               ];
                Gateway::sendToUid($toid, json_encode($date));
//               Gateway::sendToAll(json_encode($date));
               return;
       }
   }

Test:

clipboard.png
clipboard.png
clipboard.png
clipboard.png

二、数据持久化与优化两个聊天对象的唯一性

代码语言:javascript
复制
   public static function onMessage($client_id, $message)
   {
       $message_data = json_decode($message,true);
       if(!$message_data){
           return;
       }
       switch($message_data['type']){
           case "bind":
               $fromid = $message_data['fromid'];
               Gateway::bindUid($client_id, $fromid);
               return;
           case "say":
               $text = nl2br(htmlspecialchars($message_data['data']));
               $fromid = $message_data['fromid'];
               $toid = $message_data['toid'];

               $date=[
                   'type'=>'text',
                   'data'=>$text,
                   'fromid'=>$fromid,
                   'toid'=>$toid,
                   'time'=>time()
               ];

               if(Gateway::isUidOnline($toid)){
                   Gateway::sendToUid($toid, json_encode($date));
                   $date['isread']= 1;
               }else{
                   $date['isread']=0;
               }

               $date['type']="save";
               Gateway::sendToUid($fromid,json_encode($date));

               return;
       }
   }
代码语言:javascript
复制
ws.onmessage = function(e){

       var message =  eval("("+e.data+")");
          switch (message.type){
              case "init":
                   var bild = '{"type":"bind","fromid":"'+fromid+'"}';
                   ws.send(bild);

                  return;
              case "text":
                  //指定两个聊天对象聊天
                      if(toid==message.fromid) {

                          $(".chat-content").append(' <div class="chat-text section-left flex"> <span class="text"><i class="icon icon-sanjiao4 t-32"></i>' + message.data + '</span> </div>');
                      }
                  return;
              case "save":
                  //数据持久化
                  save_message(message);
                  return;
          }
    }

三、发图片、QQ表情、聊天列表、所有页面websocket,消息推送、实时更新

clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png

相关代码:https://github.com/tcyfree/ch...

参考教程:workerman实战之PHP在线客服

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、绑定用户id实现一对一客服聊天
  • 二、数据持久化与优化两个聊天对象的唯一性
  • 三、发图片、QQ表情、聊天列表、所有页面websocket,消息推送、实时更新
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档