51,407
社区成员
发帖
与我相关
我的任务
分享的需求是服务端接收到数据,转给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;
//关闭连接
});
存在一些逻辑上的错误和混淆,改了下,使用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();