swoole實戰案例解析,即時溝通技術~


客戶的即時溝通系統上線,是一個心理咨詢平台,心理咨詢師和咨詢者一對一即時溝通~

 

1.需要linux服務器安裝swoole

pecl install swoole

2.關閉防火牆或者添加端口9508

service iptables stop

3.如果用戶是阿里雲的服務器,注意一定要在安全組中添加9508端口(MDZZ這個弄了半天,一直以為是服務器安裝swoole的問題)

4.PHP抒寫后端代碼(我們項目使用的TP3.2框架)

 

<?php
// +----------------------------------------------------------------------+
// | PHP version 5.5                                                      |
// +----------------------------------------------------------------------+
// | Copyright (c) 2013-2015                                  |
// +----------------------------------------------------------------------+
// | Authors: Original Author                      |
// | 微信基本接口模塊 繼承 Base 控制器                              |
// +----------------------------------------------------------------------+
//
namespace System\Controller;
use Think\Controller;
use Wechat\Serve\Http;
use Wechat\Serve\Token;
class SwooleController extends Controller {

    
    
    
    //初始化程序
    public function index(){
        
        
        echo '正在啟動程序' . PHP_EOL;
        
        $this->server = new \swoole_websocket_server("0.0.0.0", 9501);
        
        //第一次連接的時候
        $this->server->on('open', function (\swoole_websocket_server $server, $request) {
            
            echo "新用戶連接 fd是 {$request->fd}".PHP_EOL;
        });

        
        
        $this->server->on('message', function (\swoole_websocket_server $server, $frame) {
            
            //收到用戶信息
            
            //解析用戶數據信息
            $data = json_decode($frame->data,true);
            
            
            //是否為第一次連接
            if($data['type']=='init'){
                
                //緩存用戶信息
                S(md5($data['uid']),$frame->fd);
                S($frame->fd,md5($data['uid']));
                
                echo '用戶'.$data['uid'].'注冊成功'.PHP_EOL;
                
            }else{
                if( !S(md5($data['tid']))  ){
                    $server->push($frame->fd, '{"type":"notice","message":"用戶不在線"}');
                    
                }else{
                    //否則推送消息給其他用戶
                    $this->server->push(S(md5($data['tid'])), $frame->data);    
                    
                    echo '發送給消息人'.$data['tid'].'的消息已經發送成功'.PHP_EOL;
                    echo '他的FD為'.S(md5($data['tid'])).PHP_EOL;
                }
            }
            
            
            echo "接受到信息來自 {$frame->fd} ".PHP_EOL;
            echo " 內容 {$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}".PHP_EOL;
        });
        
        
        
        //退出事件監控
        $this->server->on('close', function ($ser, $fd) {
            echo "用戶 {$fd} 退出聊天系統" . PHP_EOL;
            S(md5(S($frame->fd)),null);
            S($frame->fd,null);
        });
        
        echo '程序啟動完畢 啟動時間:' . date('Y-m-d H:i:s') . PHP_EOL;
        //啟動程序
        $this->server->start();    
        
        
        
    }

    
    
    

    
}

 

5.添加頁面前端代碼

<script>
//websocket長連接方式,swoole方式
    var wsServer = 'ws://IP地址:9501';
    ws = new WebSocket(wsServer);
    var uid = {$uid};
    var callid = {$callid};
    ws.onopen = function(){
    console.log("socket連接已打開");
    data = {
      uid:uid,
      type:'init',
    };
    ws.send(JSON.stringify(data));
    };
    
    ws.onmessage = function(e){
    console.log("message:" + e.data);
        if(e.data)
        {
            info = $.parseJSON(e.data);
            type = info.type;
            msgid = info.msgid;
            
            // 推送消息到對方客戶端
            $.post('/wechat/chat/success',{msgid:msgid},function(data){
              if(data.error==200)
              {
                for_bottom();
                $('.speak_box').append(data.data);

              }
            });


            
        }

    };
    ws.onclose = function(){
    console.log("socket連接已斷開");
    };
    ws.onerror = function(e){
    console.log("ERROR:" + e.data);
    };
    //離開頁面時關閉連接
    $(window).bind('beforeunload',function(){
    ws.close();
    }
    );
</script>

6.linux服務器運行你的后端代碼

php  index.php system/swoole  &  (加入和號是運行后台運行)

7.前台刷新頁面,看console 提示socket打開成功就可以了。進行及時溝通了~

 

特步短袖t恤男純棉2019夏季新款


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM