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

兩個不同的tcp服務如何監(jiān)聽在同一個端口上?

小W

問題描述

目前服務器只開放了一個端口供互聯(lián)網(wǎng)訪問,現(xiàn)在workerman的一個tcp服務已經(jīng)監(jiān)聽了此端口,如果再使用worker作mysql代理,或者其他方式怎么能實現(xiàn)?

通過nginx tcp代理是否可行

通過客戶端鏈接mysql服務測試打印輸出數(shù)據(jù),

MySQL客戶端發(fā)送過來的數(shù)據(jù)MySQL客戶端發(fā)送過來的數(shù)據(jù)

截圖

1720 1 1
1個回答

walkor 打賞

可以用workerman做一個分發(fā)代理,監(jiān)聽一個端口,然后onMessage里根據(jù)數(shù)據(jù)格式判斷是哪種數(shù)據(jù),然后轉(zhuǎn)發(fā)到對應的實際端口中。
例如只有一個端口,這個端口既需要轉(zhuǎn)發(fā)tcp數(shù)據(jù),也需要轉(zhuǎn)發(fā)mysql數(shù)據(jù)(作為mysql代理),假設tcp服務端口是8181,mysql端口是3306,workerman作為代理轉(zhuǎn)發(fā)這兩種數(shù)據(jù)給8181和3306端口代碼邏輯類似下面這樣

<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('tcp://0.0.0.0:8080');

$worker->onMessage = function(TcpConnection $connection, $buffer)
{
    // 如果是mysql數(shù)據(jù),轉(zhuǎn)發(fā)到本機3306端口 (作為示例is_mysql并未實現(xiàn))
    if (is_mysql($buffer)) {
        $connection_to_3306 = new AsyncTcpConnection('tcp://127.0.0.1:3306');
        $connection_to_3306->send($buffer);
        $connection->pipe($connection_to_3306);
        $connection_to_3306->pipe($connection);
        $connection_to_3306->connect();
        return;
    }
    // 否則轉(zhuǎn)發(fā)到8181端口
    $connection_to_8181 = new AsyncTcpConnection('tcp://127.0.0.1:8181');
    $connection_to_8181->send($buffer);
    $connection->pipe($connection_to_8181);
    $connection_to_8181->pipe($connection);
    $connection_to_8181->connect();
};

// 運行worker
Worker::runAll();
  • 小W 2022-11-26

    也就是只能通過發(fā)送數(shù)據(jù)時區(qū)分,connect時無法驗證

  • 小W 2022-12-01

    @walkor 大佬,使用你上面的例子,是不是需要通過客戶端先連接tcp8080,然后客戶端發(fā)送連接msg,服務端接收到msg后,再通過數(shù)據(jù)區(qū)分客戶端需要連接哪一個服務?

  • 小W 2022-12-01

    那么如何通過$buffer區(qū)分tcp服務? 測試mysql連接時,通過客戶端發(fā)送的數(shù)據(jù)來看,沒有頭緒

  • walkor 2022-12-01

    對,上面代理機制需要客戶端連8080,然后客戶端發(fā)送一個數(shù)據(jù)包,代理判斷數(shù)據(jù)包屬于mysql的數(shù)據(jù)還是你的tcp數(shù)據(jù)。只需要判斷一個數(shù)據(jù)包即可,后續(xù)數(shù)據(jù)就自動pipe方法就自動代理轉(zhuǎn)發(fā)了。
    但是想起來一個問題,mysql客戶端連接到mysql服務端后不會主動發(fā)數(shù)據(jù),要等mysql服務端發(fā)送數(shù)據(jù)后客戶端才會發(fā)送。所以上面方案應該不行。你的需求應該實現(xiàn)不了。

年代過于久遠,無法發(fā)表回答
??