亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么利用workerman實現即時聊天功能

發布時間:2021-02-04 09:18:04 來源:億速云 閱讀:280 作者:小新 欄目:編程語言

這篇文章主要介紹怎么利用workerman實現即時聊天功能,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

下載服務器端安裝文件:

怎么利用workerman實現即時聊天功能

有windows版和linux版兩個版本,我下載的linux版,在windows上也可以運行。

打開后有這些文件:

怎么利用workerman實現即時聊天功能

把這個文件放在服務器上或者項目中都可以,需要運行的就是最后一個start_for_win.bat文件。

怎么利用workerman實現即時聊天功能

運行成功。

修改start_gateway.php文件:

<?php
/**
 * This file is part of workerman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author walkor<walkor@workerman.net>
 * @copyright walkor<walkor@workerman.net>
 * @link http://www.workerman.net/
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */
use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;

// 自動加載類
require_once __DIR__ . '/../../vendor/autoload.php';

// gateway 進程,這里使用Text協議,可以用telnet測試
$gateway = new Gateway("websocket://0.0.0.0:8282");
// gateway名稱,status方便查看
$gateway->name = 'YourAppGateway';
// gateway進程數
$gateway->count = 4;
// 本機ip,分布式部署時使用內網ip
$gateway->lanIp = '127.0.0.1';
// 內部通訊起始端口,假如$gateway->count=4,起始端口為4000
// 則一般會使用4000 4001 4002 4003 4個端口作為內部通訊端口
$gateway->startPort = 2900;
// 服務注冊地址
$gateway->registerAddress = '127.0.0.1:1238';

// 心跳間隔
$gateway->pingInterval = 60;
// 心跳數據
$gateway->pingData = '{"type":"ping"}';

/*
// 當客戶端連接上來時,設置連接的onWebSocketConnect,即在websocket握手時的回調
$gateway->onConnect = function($connection)
{
    $connection->onWebSocketConnect = function($connection , $http_header)
    {
        // 可以在這里判斷連接來源是否合法,不合法就關掉連接
        // $_SERVER['HTTP_ORIGIN']標識來自哪個站點的頁面發起的websocket鏈接
        if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net')
        {
            $connection->close();
        }
        // onWebSocketConnect 里面$_GET $_SERVER是可用的
        // var_dump($_GET, $_SERVER);
    };
};
*/

// 如果不是在根目錄啟動,則運行runAll方法
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}

第24行,把tcp協議改為websocket協議;

第38行和40行,設置服務器向客戶端發送的心跳時間,檢測客戶端是否連接,未連接將會斷開。

下面的內容都是默認注釋掉的,根據自己的需要打開或者修改。

再次運行start_for_win.bat文件:

怎么利用workerman實現即時聊天功能

協議就變為websocket協議了,現在就可以做項目內的操作了。

還需要再下載一個文件:https://github.com/walkor/GatewayClient

怎么利用workerman實現即時聊天功能

把這幾個文件放進thinkphp的extend文件夾下(我用的是thinkphp5.0版本):

怎么利用workerman實現即時聊天功能

在Gateway.php的文件中方法幾乎都寫好了。

寫了一個簡單的前端頁面:

怎么利用workerman實現即時聊天功能

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title></title>
    </head>
    <body>
        <ul id="msgUl">
            <li>ws://127.0.0.1:8282</li>
        </ul>
        <input type="" name="" id="sendValue" value="" />
        <button type="button" id="sendButton">發送</button>

        <div style="margin-top: 100px">
            {volist name="msg" id="vo" empty="這里沒有數據" key ='s'}
                    <br/>
                <span>{$vo.user_name}:</span>
                <span>{$vo.msg}</span>
                <span>{$vo.createtime}</span>
                    <br/>
              {/volist}
        </div>

        <script src="http://www.zhihuapinpai.com/static/index/js/jquery-1.11.3.min.js"></script>
        <script>
            // var ws = new WebSocket("ws://123.56.216.232:8282");
            var ws = new WebSocket("ws://127.0.0.1:8282");

            ws.onopen = function() {
                $('#msgUl').append('<li>已連接上...</li>')
                sendValue();
            };

            ws.onmessage = function(evt) {
                $('#msgUl').append('<li>接收到:' + evt.data + '</li>')
                var obj = JSON.parse(evt.data);
                if (obj.type == 'onConnect') {
                    // 連接成功
                    $('#msgUl').append('<li>client_id:' + obj.client_id + '</li>')
                    $.ajax({
                        type:"POST",
                        url:"/index.php/api/Index/user_bind",
                        data:{
                            client_id:obj.client_id
                        },
                        dataType: "html",
                        success: function(data){
                            console.log('成功')
                        }
                    });
                } else if (obj.type == 'ping') {
                    // 心跳檢測 不做任何處理
                } else if (obj.type == 'chatGroup') {
                    // 群組聊天
                    $('#msgUl').append('<li>接收到:' + evt.data + '</li>')
                }
            };

            ws.onclose = function() {
                // console.log('連接已關閉...');
                $('#msgUl').append('<li>連接已關閉...</li>')
            };

            function sendValue() {
                $('#sendButton').click(function() {
                    var thisValue = $('#sendValue').val();
                    if (thisValue) {
                        ws.send(thisValue);
                        $('#msgUl').append('<li>發送數據:' + thisValue + '</li>')
                        $.get("/index.php/api/Index/send_msg/msg/"+thisValue,function (data,status) {
                            console.log('成功:'+thisValue)
                        });
                    }
                })
            }
        </script>
    </body>
</html>

第42—52行把client_id傳到后臺,與用戶表中用戶進行綁定。

后臺代碼:

<?php
namespace app\api\controller;
use think\Controller;
use GatewayClient\Gateway;
use think\Db;


class Index extends Controller
{

    public function websocket(){
        $where=[];
        $user_id=1;
        $where['from_id|to_id']=$user_id;
        $msg=Db::name('msg')->where($where)->select();
        foreach ($msg as $key=>$val){
            $msg[$key]['createtime']=date('Y-m-d H:i:s',$val['createtime']);
            $msg[$key]['user_name']=Db::name('user')->where(['id'=>$val['from_id']])->value('name');
        }
        $this->assign('msg',$msg);
        return view();
    }

    //綁定用戶
    public function user_bind($user_id=1){
        //$user_id=1; //發送人用戶id
        $client_id = input('post.client_id');
//        $user=Db::name('user')->where(['id'=>$user_id])->find();
        Gateway::bindUid($client_id, 1);
        return $client_id;
    }

    //發送信息
    public function send_msg(){
        $msg=input('msg');
        if($msg){
            $data=[
              'msg'=>$msg,
              'from_id'=>1,
              'to_id'=>2,
              'createtime'=>time()
            ];
            Db::name('msg')->insert($data);
            Gateway::sendToUid(1,$msg);
            Gateway::sendToUid(2,$msg);
        }
        return 'success';
    }

}

發送消息存入數據庫,頁面顯示即可。

怎么利用workerman實現即時聊天功能

以上是“怎么利用workerman實現即時聊天功能”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

旬邑县| 调兵山市| 米易县| 韶关市| 民县| 门源| 山西省| 张家口市| 玉门市| 中山市| 土默特左旗| 开封县| 疏勒县| 怀安县| 庆云县| 新化县| 简阳市| 教育| 新沂市| 金门县| 揭西县| 拉孜县| 汾西县| 清原| 驻马店市| 银川市| 昔阳县| 元江| 桂林市| 新乡县| 鹤壁市| 永定县| 遂平县| 临漳县| 余干县| 腾冲县| 兴义市| 舒兰市| 麦盖提县| 麻江县| 文成县|