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

作為Websocket客戶端時,如何接收其他程序的調(diào)用?

國躍

問題描述

我的問題大致和下面這位的一致,就是我開啟了Websocket客戶端和Websocket服務端連接成功后,我想從其他程序(同服務器中的其他框架項目)將消息推送給這個Websocket客戶端,從而和Websocket服務端進行交互。
http://m.wtbis.cn/q/9045

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

我是剛剛開始學習,按照其他問題的示例,我開啟了一個text協(xié)議的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',
    ];

    // 設(shè)置以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;
    };

     // 連接上發(fā)生錯誤時,一般是連接遠程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){
    // 開啟一個內(nèi)部端口,方便內(nèi)部系統(tǒng)推送數(shù)據(jù),Text協(xié)議格式 文本+換行符
    $inner_text_worker = new Worker('Text://0.0.0.0:5678');
    $inner_text_worker->onMessage = function($connection, $buffer)
    {
        global $worker1;
        // $data數(shù)組格式,里面有uid,表示向那個uid的頁面推送數(shù)據(jù)
        $data = json_decode($buffer, true);
        $uid = $data['uid'];
        var_dump('收到數(shù)據(jù)', $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調(diào)用。

<?php
// 建立socket連接到內(nèi)部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1); 
// 推送的數(shù)據(jù),包含uid字段,表示是給這個uid推送
$data = array('uid'=>'uid1', 'percent'=>'88%');
// 發(fā)送數(shù)據(jù),注意5678端口是Text協(xié)議的端口,Text協(xié)議需要在數(shù)據(jù)末尾加上換行符
fwrite($client, json_encode($data)."\n");
// 讀取推送結(jié)果
echo fread($client, 8192);

結(jié)果顯示我的global不起作用

截圖

是哪里出現(xiàn)了問題,請大家指教一下。

626 2 0
2個回答

walkor 打賞

只啟動一個worker1,不用啟動worker2,worker2的代碼合并到worker1里

  • 國躍 2024-05-17

    放到了worker1里,但是執(zhí)行push.php時阻塞了,給websocket服務端發(fā)送消息也沒有成功。

  • 國躍 2024-05-17

    代碼放到了下面。請指點。

  • 國躍 2024-05-17

    解決了,text進程的onMessage不使用global,使用use($worker1)。阻塞的問題,把echo fread($client, 8192)去除掉就可以了。謝謝。

國躍

之前有寫到同一個worker里,我又試了一下,然后推送時push.php阻塞了,第62行的發(fā)送消息也沒有發(fā)送成功。

<?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',
    ];

    // 設(shè)置以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;
    };

     // 連接上發(fā)生錯誤時,一般是連接遠程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();

    // 開啟一個內(nèi)部端口,方便內(nèi)部系統(tǒng)推送數(shù)據(jù),Text協(xié)議格式 文本+換行符
    $inner_text_worker = new Worker('Text://0.0.0.0:5678');
    $inner_text_worker->onMessage = function($connection, $buffer)
    {
        global $worker1;
        // $data數(shù)組格式,里面有uid,表示向那個uid的頁面推送數(shù)據(jù)
        $data = json_decode($buffer, true);
        $uid = $data['uid'];
        var_dump('收到數(shù)據(jù)', $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();
  • 暫無評論
年代過于久遠,無法發(fā)表回答
??