swoole实现一个多用户持久tcp代理服务的代码

代码语言:phpcli

所属分类:其他

代码描述:swoole实现一个多用户持久tcp代理服务的代码,通过为每个用户创建一个client来持久连接目标服务器实现多用户持久代理。

代码标签: swoole tcp 持久 多用户 代理 服务 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<?php
$fd_relationarr = [];//连接参考表

$targetHost = '127.0.0.1';//代理目标ip

$targetPort = 9006;//代理目标端口

$proxyServer = new Swoole\Server('127.0.0.1', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);




$proxyServer->on('Connect', function ($server, $fd) {

    echo "Client connected: $fd\n";

    global $targetHost;
    global $targetPort;
    // 创建一个异步TCP客户端

    $targetClient = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP);

    // 连接目标服务器

    if (!$targetClient->connect($targetHost, $targetPort, 0.5)) {

        $server->send($fd, "Proxy server failed to connect to target server\n");

        $server->close($fd);

        return;

    }
    global $fd_relationarr;
    $fd_relationarr[] = ["fd" => $fd,
        "client" => $targetClient];

    while (true) {
        $data = $targetClient->recv();
        if (strlen($data) > 0) {
            $server->send($fd, $data);
            // echo $data;
            //   $targetClient->send(time() . PHP_EOL);
        } else {
            if ($data === '') {
                // 全等于空 直接关闭连接
                $targetClient->close();
                break;
            } else {
                if ($data === false) {
                    // 可以自行根据业务逻辑和错误码进行处理,例如:
                    // 如果超时时则不关闭连接,其他情况直接关闭连接
                    if ($targetClient->errCode !== SOCKET_ETIMEDOUT) {
                        $targetClient->close();
                        break;
                    }
                } else {
                    $targetClient->close();
                    break;
                }
            }
        }
        \Co::sleep(1);
    }




    // 将客户端请求转发给目标服务器
    //$targetClient->send($data);

    // 接收目标服务器的响应并将其返回给客户端

    // $response = $targetClient->recv();

    // if (empty($response)) {

    //     $server->send($fd, "Proxy server failed to receive response from target server\n");

    // } else {

    //     $server->send($fd, $response);

    // }

    // 关闭目标服务器的连接
    //$targetClient->close();

    // $server->close($fd);


});

.........完整代码请登录后点击上方下载按钮下载查看

网友评论0