GatewayWorker 如何用AsyncTcpConnection协议,来作为客户端连接别人的socket.

veinliu

RT,我用Gatewayworker 实现了几个接口,都是服务端。

我有一个接口是作为socket客户端,我试了用workerman,用AsyncTcpConnection,可以连接对方服务器,但我想把AsyncTcpConnection集成到原来的几个接口一起,代码怎么写,各位前辈给指导一下,集成的方法,最好是详细一点的,我之前没写过代码,接触PHP和workerman才两个星期不到。谢谢各位。

2766 4 0
4个回答

veinliu

有类似的Demo代码,辛苦各位贴出来,给我学习一下。

  • 暂无评论
blogdaren

1、既然是刚接触,建议老老实实看手册,使用workerman进行业务开发需要一定的功底,否则很容易自己给自己埋很多不是坑的坑;
2、至于使用 workerman 或者 gatewayworker 作为客户端,手册上就说的很详细了,DEMO代码也有,怎么整合到自己的上下文也不是什么难事,难的还是你没认真看手册:
http://doc.workerman.net/faq/as-wss-client.html

  • 暂无评论
veinliu

每天都在看手册,没写过代码,所以不是很懂,但是我想把AsyncTcpConnection 发出的连接也当作一个client用,这样发消在Events中调用,通迅就比较方便。

我定议了一个协议 Xml
用的AsyncTcpConnection

新建一个Gateway,运行就报错
这个是gateway

$internal_gateway = new Gateway("Xml://192.168.3.8:7273");
$internal_gateway->name='sis_client';
// #### 不要与原来start_gateway.php的一样####
// #### 比原来跨度大一些,比如在原有startPort基础上+1000 ####
$internal_gateway->startPort = 4300;
// #### 这里设置成与原start_gateway.php 一样 ####
$internal_gateway->registerAddress = '127.0.0.1:1238';

这个是定义的协议,

public static function input($recv_buffer,AsyncTcpConnection $connection )
{

        if(strlen($recv_buffer) < 1)
        {
            // 不够10字节,返回0继续等待数据
            return 0;
        }
        // 返回包长,包长包含 头部数据长度+包体长度
        $total_len = base_convert(substr($recv_buffer, 0, 10), 10, 10);
        return $total_len;
    }

    public static function decode($recv_buffer)
    {
        // 请求包体
        $body = $recv_buffer;
        return simplexml_load_string($body);
    }

    public static function encode($xml_string)
    {
        // 包体+包头的长度
        //$total_length = strlen($xml_string)+10;
        // 长度部分凑足10字节,位数不够补0
        //$total_length_str = str_pad($total_length, 10, '0', STR_PAD_LEFT);
        // 返回数据
        //return $total_length_str . $xml_string;
        return  $xml_string;
    }
}
stream_socket_server(): unable to connect to tcp://192.168.3.8:7273 (Cannot assign requested address) in file /var/www/html/GatewayWorker/vendor/workerman/workerman/Worker.php on line 2206

Fatal error: Uncaught exception 'Exception' with message 'Cannot assign requested address' in /var/www/html/GatewayWorker/vendor/workerman/workerman/Worker.php on line 2208

Exception: Cannot assign requested address in /var/www/html/GatewayWorker/vendor/workerman/workerman/Worker.php on line 2208

Call Stack:
    0.0002     231320   1. {main}() /var/www/html/GatewayWorker/start.php:0
    0.0114    1362368   2. Workerman\Worker::runAll() /var/www/html/GatewayWorker/start.php:37
    0.0137    1398216   3. Workerman\Worker::initWorkers() /var/www/html/GatewayWorker/vendor/workerman/workerman/Worker.php:504
    0.0143    1404712   4. Workerman\Worker->listen() /var/www/html/GatewayWorker/vendor/workerman/workerman/Worker.php:646
  • blogdaren 2019-11-22

    这个报错的意思是指监听的IP并不是当前服务器的IP所致

  • veinliu 2019-11-22

    因为是要连接远程的服务器,所以是发起连接而不是监听本地IP端口。但我不知道怎么修改协议能让它支持主动发起远程连接。

  • blogdaren 2019-11-22

    1、没有让你监听端口,是你的代码报错显示程序有在监听端口的行为,为什么监听了,你得查自己的代码;
    2、AsyncTcpConnection原本就是一个基于workerman的客户端类库;

  • veinliu 2019-11-22

    那请问一下,我怎么样让 AsyncTcpConnection 通讯的数据在GatewayWorker中的Events中用onMessage来处理?

veinliu

应该是建立Gateway 不支持这样连接远程,但我不明白怎么样才能连接远程地址,让Gateway 作为一个客户端。

Fatal error: Uncaught exception 'Exception' with message 'class \Protocols\Async                        TcpConnection not exist' in /var/www/html/GatewayWorker/vendor/workerman/workerm                        an/Worker.php on line 2272

Exception: class \Protocols\AsyncTcpConnection not exist in /var/www/html/Gatewa                        yWorker/vendor/workerman/workerman/Worker.php on line 2272

Call Stack:
    0.0002     231320   1. {main}() /var/www/html/GatewayWorker/start.php:0
    0.0201    1346776   2. require_once('/var/www/html/GatewayWorker/Application                        s/YourApp/start_xml_gateway.php') /var/www/html/GatewayWorker/start.php:34
    0.0201    1347464   3. GatewayWorker\Gateway->__construct() /var/www/html/Ga                        tewayWorker/Applications/YourApp/start_xml_gateway.php:10
    0.0201    1347600   4. Workerman\Worker->__construct() /var/www/html/Gateway                        Worker/vendor/workerman/gateway-worker/src/Gateway.php:239
    0.0201    1358672   5. Workerman\Worker->parseSocketAddress() /var/www/html/                        GatewayWorker/vendor/workerman/workerman/Worker.php:2169
  • 暂无评论
年代过于久远,无法发表回答
🔝