使用的是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
沒找到直接或間接可以獲取當前連接的方法和屬性
連接在gateway進程,Events 類運行在worker進程,Events 類里無法直接獲取gateway進程里的連接對象。
你要獲取連接干什么?
// 建立本地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è)備
我在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();
};
還有一個問題,客戶端開連接后,tcpb的onClose能監(jiān)聽到,tcpa的onClose能監(jiān)聽不到
目的:
客戶端發(fā)送的消息,tcpa和tcpb都監(jiān)聽到
客戶端斷開連接后,tcpa和tcpb都監(jiān)聽到
string(10) "tcpB啟動"
string(16) "tcpB設(shè)備連接"
string(22) "tcpB收到消息--aTob"
string(17) "tcpB:斷開連接"
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();
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();
pipe會覆蓋$worker->onMessage $worker->onClose方法,用了pipe后$worker->onMessage $worker->onClose就不會生效了
客戶端是自己的
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 這個試過,行不通
還有其他可行的方案嗎