作为Websocket客户端时,如何接收其他程序的调用?

国跃

问题描述

我的问题大致和下面这位的一致,就是我开启了Websocket客户端和Websocket服务端连接成功后,我想从其他程序(同服务器中的其他框架项目)将消息推送给这个Websocket客户端,从而和Websocket服务端进行交互。
https://www.workerman.net/q/9045

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

我是刚刚开始学习,按照其他问题的示例,我开启了一个text协议的worker,并通过global方式传入websocket客户端的worker。

<?php           
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;

require_once __DIR__ . '/vendor/autoload.php';

global $worker1;

$worker1 = new Worker();

$worker1->onWorkerStart = function($worker1){
    // ssl需要访问443端口
    $con = new AsyncTcpConnection('ws://im-dev.xxxx.com:443/ws/');
    $con->headers = [
        'Sec-WebSocket-Protocol' => 'xmpp',
    ];

    // 设置以ssl加密方式访问,使之成为wss
    $con->transport = 'ssl';

    $con->onConnect = function($connection){
        echo "tcp connected\n";
    };

    $con->onWebSocketConnect = function(AsyncTcpConnection $con) {
        var_dump('onWebSocketConnect');
        $con->send("<open xmlns='urn:ietf:params:xml:ns:xmpp-framing' version='1.0'/>");
    };

    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        global $worker1;

        var_dump('onMessage');
        var_dump($data);
        $worker1->con = $con;
    };

     // 连接上发生错误时,一般是连接远程websocket服务器失败错误
    $con->onError = function($connection, $code, $msg){
        echo "error: $msg\n";
    };

    $con->onClose = function($connection){
        echo "connection closed and try to reconnect\n";
        // 如果连接断开,1秒后重连
        //$connection->reConnect(1);
    };

    $con->connect();
};

$worker2 = new Worker();
$worker2->onWorkerStart = function($worker2){
    // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
    $inner_text_worker = new Worker('Text://0.0.0.0:5678');
    $inner_text_worker->onMessage = function($connection, $buffer)
    {
        global $worker1;
        // $data数组格式,里面有uid,表示向那个uid的页面推送数据
        $data = json_decode($buffer, true);
        $uid = $data['uid'];
        var_dump('收到数据', $data);

        $worker1->con->send("<open xmlns='urn:ietf:params:xml:ns:xmpp-framing' version='1.0'/>");
        var_dump('23232323');

    };
    $inner_text_worker->listen();

};
Worker::runAll();

然后用push.php调用。

<?php
// 建立socket连接到内部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1); 
// 推送的数据,包含uid字段,表示是给这个uid推送
$data = array('uid'=>'uid1', 'percent'=>'88%');
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\n");
// 读取推送结果
echo fread($client, 8192);

结果显示我的global不起作用

截图

是哪里出现了问题,请大家指教一下。

314 2 0
2个回答

walkor 打赏

只启动一个worker1,不用启动worker2,worker2的代码合并到worker1里

  • 国跃 2024-05-17

    放到了worker1里,但是执行push.php时阻塞了,给websocket服务端发送消息也没有成功。

  • 国跃 2024-05-17

    代码放到了下面。请指点。

  • 国跃 2024-05-17

    解决了,text进程的onMessage不使用global,使用use($worker1)。阻塞的问题,把echo fread($client, 8192)去除掉就可以了。谢谢。

国跃

之前有写到同一个worker里,我又试了一下,然后推送时push.php阻塞了,第62行的发送消息也没有发送成功。

<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;

require_once __DIR__ . '/vendor/autoload.php';

global $worker1;

// 建立与websocket服务端连接
$worker1 = new Worker();

$worker1->onWorkerStart = function($worker1){
    // ssl需要访问443端口
    $con = new AsyncTcpConnection('ws://im-dev.gooyee.com:443/ws/');
    $con->headers = [
        'Sec-WebSocket-Protocol' => 'xmpp',
    ];

    // 设置以ssl加密方式访问,使之成为wss
    $con->transport = 'ssl';

    $con->onConnect = function($connection){
        echo "tcp connected\n";
    };

    $con->onWebSocketConnect = function(AsyncTcpConnection $con) {
        var_dump('onWebSocketConnect');
        $con->send("<open xmlns='urn:ietf:params:xml:ns:xmpp-framing' version='1.0'/>");
    };

    $con->onMessage = function(AsyncTcpConnection $con, $data)use($worker1) {
        global $worker1;

        var_dump('onMessage');
        var_dump($data);
        $worker1->con = $con;
    };

     // 连接上发生错误时,一般是连接远程websocket服务器失败错误
    $con->onError = function($connection, $code, $msg){
        echo "error: $msg\n";
    };

    $con->onClose = function($connection){
        echo "connection closed and try to reconnect\n";
        // 如果连接断开,1秒后重连
        //$connection->reConnect(1);
    };

    $con->connect();

    // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
    $inner_text_worker = new Worker('Text://0.0.0.0:5678');
    $inner_text_worker->onMessage = function($connection, $buffer)
    {
        global $worker1;
        // $data数组格式,里面有uid,表示向那个uid的页面推送数据
        $data = json_decode($buffer, true);
        $uid = $data['uid'];
        var_dump('收到数据', $data);

        $worker1->con->send("<open xmlns='urn:ietf:params:xml:ns:xmpp-framing' version='1.0'/>");
        var_dump('23232323');

    };
    $inner_text_worker->listen();

};
Worker::runAll();
  • 暂无评论
×
🔝