国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

如何在gatewayWorker的onConnect方法中獲取到當前客戶端連接

liong

問題描述

使用的是gatewayWorker,
BusinessWorker設(shè)置了自定義的業(yè)務(wù)處理類
$worker = new BusinessWorker();
$worker->eventHandler = \App\GatewayWorker\Events::class;

Events類代碼:

<?php
namespace App\GatewayWorker;
use GatewayWorker\Lib\Context;
use GatewayWorker\Lib\Gateway;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\TcpConnection;
class Events
{
public static function onWorkerStart($businessWorker){
var_dump('啟動服務(wù)');
}
public static function onConnect($client_id){
// todo 當前客戶端連接 $connection
var_dump('連接成功-' . $client_id);
}
public static function onWebSocketConnect($client_id, $data){
}
public static function onMessage($client_id, $message){
}

public static function onClose($client_id){
    var_dump('斷開連接-' . $client_id);
}

}

在Events類的onConnect方法中如何獲取當前客戶端連接

為此你搜索到了哪些方案及不適用的原因

查看了GatewayWorker\Lib\Context和GatewayWorker\Lib\Gateway和GatewayWorker\BusinessWorker
沒找到直接或間接可以獲取當前連接的方法和屬性

836 1 0
1個回答

walkor 打賞

連接在gateway進程,Events 類運行在worker進程,Events 類里無法直接獲取gateway進程里的連接對象。
你要獲取連接干什么?

  • liong 2024-01-10
    // 建立本地80端口的異步連接
    $connection_to_80 = new AsyncTcpConnection('tcp://127.0.0.1:80');
    // 設(shè)置將當前客戶端連接的數(shù)據(jù)導向80端口的連接
    $connection->pipe($connection_to_80);
    // 設(shè)置80端口連接返回的數(shù)據(jù)導向客戶端連接
    $connection_to_80->pipe($connection);
    // 執(zhí)行異步連接
    $connection_to_80->connect();

    把以上代碼放到 onConnect 運行,讓每個設(shè)備連接tpca后連接到tcpb, tcpb發(fā)送數(shù)據(jù)給tcpa后,tcpa再發(fā)送給設(shè)備

  • walkor 2024-01-10

    你在 start_gateway.php 里 onConnect里可以這么做

  • liong 2024-01-12

    我在tcpa服務(wù)器建立與tcpb服務(wù)器的連接
    // 當客戶端連接上來時,綁定到tcpB
    // gateway 進程,這里使用Text協(xié)議,可以用telnet測試
    $gateway = new Gateway("tcp://0.0.0.0:3000");
    // gateway名稱,status方便查看
    $gateway->name = 'gatewaya';
    // gateway進程數(shù),一般設(shè)置2個就足夠
    $gateway->count = 2;
    // 本機ip,分布式部署時使用內(nèi)網(wǎng)ip
    $gateway->lanIp = '127.0.0.1';
    // 內(nèi)部通訊起始端口,假如$gateway->count=2,起始端口為2900
    // 則一般會使用2900 2901 2個端口作為內(nèi)部通訊端口
    $gateway->startPort = 2900;
    // 服務(wù)注冊地址
    $gateway->registerAddress = '127.0.0.1:1238';

    // 當客戶端連接上來時,綁定到tcpB
    $gateway->onConnect = function($connection)
    {
    $tcpb = new \Workerman\Connection\AsyncTcpConnection('tcp://0.0.0.0:3002');
    $connection->pipe($tcpb);
    $tcpb->pipe($connection);
    $tcpb->connect();
    };

    客戶端連接到tcpa服器成功,
    tcp服務(wù)器a和b都能看到連接信息
    string(35) "tcpA-onConnect:7f0000010b5400000001"
    string(35) "tcpB-onConnect:7f0000010a2800000001"

    當客戶端發(fā)送信息給tcp服務(wù)器a,沒有接到信息
    tcp服務(wù)器b能接收到信息

    為何tcp服務(wù)器a的不能接收到信息,是因為cp服務(wù)器a的start_gateway.php設(shè)置了以下代碼導致的嗎

    $gateway->onConnect = function($connection)
    {
    $tcpb = new \Workerman\Connection\AsyncTcpConnection('tcp://0.0.0.0:3002');
    $connection->pipe($tcpb);
    $tcpb->pipe($connection);
    $tcpb->connect();
    };

  • liong 2024-01-12

    目的:
    客戶端發(fā)送消息給tcpa,tcpa能接收到,tcpb也能接收到

  • liong 2024-01-12

    還有一個問題,客戶端開連接后,tcpb的onClose能監(jiān)聽到,tcpa的onClose能監(jiān)聽不到
    目的:
    客戶端發(fā)送的消息,tcpa和tcpb都監(jiān)聽到
    客戶端斷開連接后,tcpa和tcpb都監(jiān)聽到

  • walkor 2024-01-12

    如果你只做轉(zhuǎn)發(fā)的話,用workerman吧。gateway不支持pipe這種機制

  • liong 2024-01-12

    好的
    明天試試

  • liong 2024-01-12

    感謝大佬

  • liong 2024-01-15

    用workerman也是一樣的
    Press Ctrl+C to stop. Start success.
    string(22) "tcpA啟動123-10:05:01"
    string(16) "tcpA設(shè)備連接"

    string(10) "tcpB啟動"
    string(16) "tcpB設(shè)備連接"
    string(22) "tcpB收到消息--aTob"
    string(17) "tcpB:斷開連接"

  • liong 2024-01-15

    tcpa代碼
    <?php
    use Workerman\Worker;
    use Workerman\Connection\TcpConnection;
    use Workerman\Connection\AsyncTcpConnection;
    require_once __DIR__ . '/vendor/autoload.php';
    $worker = new Worker("tcp://0.0.0.0:3000");
    $worker->count = 1;

    $worker->onWorkerStart = function(Worker $worker)
    {
    var_dump('tcpA啟動123-'.date('H:i:s'));
    };
    // tcp連接建立后
    $worker->onConnect = function(TcpConnection $connection)
    {
    var_dump('tcpA設(shè)備連接');
    // 建立本地80端口的異步連接
    $connection_to_80 = new AsyncTcpConnection('tcp://127.0.0.1:3001');
    // 設(shè)置將當前客戶端連接的數(shù)據(jù)導向80端口的連接
    $connection->pipe($connection_to_80);
    // 設(shè)置80端口連接返回的數(shù)據(jù)導向客戶端連接
    $connection_to_80->pipe($connection);
    // 執(zhí)行異步連接
    $connection_to_80->connect();
    };
    // 當客戶端發(fā)來數(shù)據(jù)時
    $worker->onMessage = function(TcpConnection $connection, $data)
    {
    var_dump('tcpA收到消息--'.$data);
    // 向客戶端發(fā)送hello $data
    //$connection->send('hello ' . $data);
    };

    $worker->onClose = function(TcpConnection $connection)
    {
    var_dump('tcpA:斷開連接');
    };

    // 運行worker
    Worker::runAll();

  • liong 2024-01-15

    tcpb代碼
    <?php
    use Workerman\Worker;
    use Workerman\Connection\TcpConnection;
    require_once __DIR__ . '/vendor/autoload.php';
    $worker = new Worker("tcp://0.0.0.0:3001");
    $worker->count = 1;

    $worker->onWorkerStart = function(Worker $worker)
    {
    var_dump('tcpB啟動');
    };
    $worker->onConnect = function(TcpConnection $connection){
    var_dump('tcpB設(shè)備連接');
    };
    // 當客戶端發(fā)來數(shù)據(jù)時
    $worker->onMessage = function(TcpConnection $connection, $data)
    {
    var_dump('tcpB收到消息--'.$data);
    // 向客戶端發(fā)送hello $data
    //$connection->send('hello ' . $data);
    };

    $worker->onClose = function(TcpConnection $connection)
    {
    var_dump('tcpB:斷開連接');
    };

    // 運行worker
    Worker::runAll();

  • liong 2024-01-15

    收到消息和斷開連接,只有tcpb能監(jiān)聽到

  • walkor 2024-01-15

    pipe會覆蓋$worker->onMessage $worker->onClose方法,用了pipe后$worker->onMessage $worker->onClose就不會生效了

  • liong 2024-01-15

    客戶端是自己的
    tcpa是自己的
    tcpb服務(wù)器是別人的

    每個客戶端和tcpa的連接狀態(tài)通過tcpa連接tcpb要保持一致
    每個客戶端的數(shù)據(jù)經(jīng)過tcpa轉(zhuǎn)發(fā)個tcpb,tcpa要處理
    tcpb發(fā)數(shù)據(jù)給tcpa,然后由tcpa發(fā)送給客戶端
    http://www.wtbis.cn/doc/workerman/async-tcp-connection/construct.html 這個試過,行不通
    還有其他可行的方案嗎

年代過于久遠,無法發(fā)表回答
??