使用的是gatewayWorker,
BusinessWorker設(shè)置了自定義的業(yè)務(wù)處理類(lèi)
$worker = new BusinessWorker();
$worker->eventHandler = \App\GatewayWorker\Events::class;
Events類(lèi)代碼:
<?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('啟動(dòng)服務(wù)');
}
public static function onConnect($client_id){
// todo 當(dāng)前客戶(hù)端連接 $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('斷開(kāi)連接-' . $client_id);
}
}
在Events類(lèi)的onConnect方法中如何獲取當(dāng)前客戶(hù)端連接
查看了GatewayWorker\Lib\Context和GatewayWorker\Lib\Gateway和GatewayWorker\BusinessWorker
沒(méi)找到直接或間接可以獲取當(dāng)前連接的方法和屬性
連接在gateway進(jìn)程,Events 類(lèi)運(yùn)行在worker進(jìn)程,Events 類(lèi)里無(wú)法直接獲取gateway進(jìn)程里的連接對(duì)象。
你要獲取連接干什么?
// 建立本地80端口的異步連接
$connection_to_80 = new AsyncTcpConnection('tcp://127.0.0.1:80');
// 設(shè)置將當(dāng)前客戶(hù)端連接的數(shù)據(jù)導(dǎo)向80端口的連接
$connection->pipe($connection_to_80);
// 設(shè)置80端口連接返回的數(shù)據(jù)導(dǎo)向客戶(hù)端連接
$connection_to_80->pipe($connection);
// 執(zhí)行異步連接
$connection_to_80->connect();
把以上代碼放到 onConnect 運(yùn)行,讓每個(gè)設(shè)備連接tpca后連接到tcpb, tcpb發(fā)送數(shù)據(jù)給tcpa后,tcpa再發(fā)送給設(shè)備
我在tcpa服務(wù)器建立與tcpb服務(wù)器的連接
// 當(dāng)客戶(hù)端連接上來(lái)時(shí),綁定到tcpB
// gateway 進(jìn)程,這里使用Text協(xié)議,可以用telnet測(cè)試
$gateway = new Gateway("tcp://0.0.0.0:3000");
// gateway名稱(chēng),status方便查看
$gateway->name = 'gatewaya';
// gateway進(jìn)程數(shù),一般設(shè)置2個(gè)就足夠
$gateway->count = 2;
// 本機(jī)ip,分布式部署時(shí)使用內(nèi)網(wǎng)ip
$gateway->lanIp = '127.0.0.1';
// 內(nèi)部通訊起始端口,假如$gateway->count=2,起始端口為2900
// 則一般會(huì)使用2900 2901 2個(gè)端口作為內(nèi)部通訊端口
$gateway->startPort = 2900;
// 服務(wù)注冊(cè)地址
$gateway->registerAddress = '127.0.0.1:1238';
// 當(dāng)客戶(hù)端連接上來(lái)時(shí),綁定到tcpB
$gateway->onConnect = function($connection)
{
$tcpb = new \Workerman\Connection\AsyncTcpConnection('tcp://0.0.0.0:3002');
$connection->pipe($tcpb);
$tcpb->pipe($connection);
$tcpb->connect();
};
客戶(hù)端連接到tcpa服器成功,
tcp服務(wù)器a和b都能看到連接信息
string(35) "tcpA-onConnect:7f0000010b5400000001"
string(35) "tcpB-onConnect:7f0000010a2800000001"
當(dāng)客戶(hù)端發(fā)送信息給tcp服務(wù)器a,沒(méi)有接到信息
tcp服務(wù)器b能接收到信息
為何tcp服務(wù)器a的不能接收到信息,是因?yàn)閏p服務(wù)器a的start_gateway.php設(shè)置了以下代碼導(dǎo)致的嗎
$gateway->onConnect = function($connection)
{
$tcpb = new \Workerman\Connection\AsyncTcpConnection('tcp://0.0.0.0:3002');
$connection->pipe($tcpb);
$tcpb->pipe($connection);
$tcpb->connect();
};
還有一個(gè)問(wèn)題,客戶(hù)端開(kāi)連接后,tcpb的onClose能監(jiān)聽(tīng)到,tcpa的onClose能監(jiān)聽(tīng)不到
目的:
客戶(hù)端發(fā)送的消息,tcpa和tcpb都監(jiān)聽(tīng)到
客戶(hù)端斷開(kāi)連接后,tcpa和tcpb都監(jiān)聽(tīng)到
string(10) "tcpB啟動(dòng)"
string(16) "tcpB設(shè)備連接"
string(22) "tcpB收到消息--aTob"
string(17) "tcpB:斷開(kāi)連接"
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啟動(dòng)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è)置將當(dāng)前客戶(hù)端連接的數(shù)據(jù)導(dǎo)向80端口的連接
$connection->pipe($connection_to_80);
// 設(shè)置80端口連接返回的數(shù)據(jù)導(dǎo)向客戶(hù)端連接
$connection_to_80->pipe($connection);
// 執(zhí)行異步連接
$connection_to_80->connect();
};
// 當(dāng)客戶(hù)端發(fā)來(lái)數(shù)據(jù)時(shí)
$worker->onMessage = function(TcpConnection $connection, $data)
{
var_dump('tcpA收到消息--'.$data);
// 向客戶(hù)端發(fā)送hello $data
//$connection->send('hello ' . $data);
};
$worker->onClose = function(TcpConnection $connection)
{
var_dump('tcpA:斷開(kāi)連接');
};
// 運(yùn)行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啟動(dòng)');
};
$worker->onConnect = function(TcpConnection $connection){
var_dump('tcpB設(shè)備連接');
};
// 當(dāng)客戶(hù)端發(fā)來(lái)數(shù)據(jù)時(shí)
$worker->onMessage = function(TcpConnection $connection, $data)
{
var_dump('tcpB收到消息--'.$data);
// 向客戶(hù)端發(fā)送hello $data
//$connection->send('hello ' . $data);
};
$worker->onClose = function(TcpConnection $connection)
{
var_dump('tcpB:斷開(kāi)連接');
};
// 運(yùn)行worker
Worker::runAll();
pipe會(huì)覆蓋$worker->onMessage $worker->onClose方法,用了pipe后$worker->onMessage $worker->onClose就不會(huì)生效了
客戶(hù)端是自己的
tcpa是自己的
tcpb服務(wù)器是別人的
每個(gè)客戶(hù)端和tcpa的連接狀態(tài)通過(guò)tcpa連接tcpb要保持一致
每個(gè)客戶(hù)端的數(shù)據(jù)經(jīng)過(guò)tcpa轉(zhuǎn)發(fā)個(gè)tcpb,tcpa要處理
tcpb發(fā)數(shù)據(jù)給tcpa,然后由tcpa發(fā)送給客戶(hù)端
http://wtbis.cn/doc/workerman/async-tcp-connection/construct.html 這個(gè)試過(guò),行不通
還有其他可行的方案嗎