Swoole可以既是客户端也是服务端吗?

cqbtgcyy 2024-05-28 11:47:59

的需求是服务端接收到数据,转给java服务端处理,保存处理结果。

在网上找了demo,做为服务端接收到数据,但我想把接收到的数据发送到java开发的服务端吗?

以下是我的代码,直接发送$client->send("hello world") 但是没接收到数据。


$server = new Swoole\Server('192.168.5.250', 9501);
$client = new Swoole\Client(SWOOLE_SOCK_TCP);//新建客户端
 
$server->on('Connect', function ($server, $fd) {
    echo $fd."-Client: Connect.\n";
});
 
 
$server->on('Receive', function ($server, $fd, $reactor_id, $data) {
    $server->send($fd, "Server: {$data}"."zhongguo");
        if (!$client->connect('192.168.5.105', 9999, 0.5)) {
            die("connect failed.");
        }
 
        //向服务器发送数据
        if (!$client->send("hello world")) {
            echo '发送失败';
        }
 
        //从服务器接收数据
        $data = $client->recv();
        if (!$data) {
            die("recv failed.");
        }
 
        //打印从服务端接收到的数据
        echo $data;
 
        //关闭连接
 
});

 

...全文
901 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
何遇mirror 2024-05-29
  • 打赏
  • 举报
回复

存在一些逻辑上的错误和混淆,改了下,使用WorkerStart事件初始化与Java服务端的连接,这样连接只会在工作进程启动时建立一次,而不是每次接收到数据时尝试连接。调整了数据转发的逻辑,确保在接收到客户端数据后,能正确地发送给Java服务端,并且可以选择性地处理Java服务端的响应。


<?php
$server = new Swoole\Server('192.168.5.250', 9501);

$server->on('WorkerStart', function ($server, $worker_id) {
    // 这里初始化与Java服务端的连接更合适,因为连接只需要建立一次,可以在工作进程启动时做
    global $java_client;
    $java_client = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP);
    if (!$java_client->connect('192.168.5.105', 9999, 0.5)) {
        echo "Connect to Java server failed.\n";
        exit;
    } else {
        echo "Connected to Java server.\n";
    }
});

$server->on('Connect', function ($server, $fd) {
    echo "Client: {$fd} - Connect.\n";
});

$server->on('Receive', function ($server, $fd, $reactor_id, $data) {
    echo "Server received: {$data}\n";
    
    global $java_client;
    
    // 向Java服务端发送数据
    if (!$java_client->send("{$data}")) {
        echo "Send data to Java server failed.\n";
    } else {
        echo "Data sent to Java server.\n";
        
        // 接收Java服务端的响应(根据实际情况调整是否需要等待响应)
        $response = $java_client->recv();
        if ($response === false) {
            echo "Recv from Java server failed.\n";
        } else {
            echo "Response from Java server: {$response}\n";
            // 根据需要处理响应,并决定是否回发给客户端
            // $server->send($fd, $response); // 如果需要将Java的响应发回客户端,取消注释此行
        }
    }
});

$server->on('Close', function ($server, $fd) {
    echo "Client: {$fd} - Close.\n";
});

$server->start();

51,407

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧