0

swoole_client同步tcp客户端被动断开后,再次发送数据到服务器时,返回结果不为false

环境

swoole-4.3.1
php7.0.33

相关代码

server.php
<?php
// 创建Server对象,监听 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);
// 设置心跳检测
$serv->set([
    'heartbeat_idle_time'      => 5,
    'heartbeat_check_interval' => 5,
    'task_enable_coroutine'    => true,
    'task_worker_num'          => 1,
]);
//监听连接进入事件
$serv->on('connect', function ($serv, $fd) {
    echo "Client: Connect.\n";
});

//监听数据接收事件
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
    var_dump($data);
    $serv->send($fd, "Server: " . $data);
    $serv->task('aaa');
});

//监听连接关闭事件
$serv->on('close', function ($serv, $fd) {
    echo "Client: Close.\n";
});

//启动服务器
$serv->start();
client.php
<?php
$client = new \swoole_client(SWOOLE_SOCK_TCP | SWOOLE_KEEP);
$client->connect('127.0.0.1', 9501, 5);
sleep(10);
var_dump($client->send(1));
var_dump($client->send(1));

结果

server.php结果
Client: Connect.
Client: Close.
// client.php结果
int(1)
bool(false)

从结果上看server并没有受到client发出的1,但client的发送结果却不返回false,求解

CJJW 5
4月2日提问
1 个回答
0

你会发现直接在connect中直接close这个socket 客户端还是能send成功。这是因为底层socket关闭时,再客户端并无感知。需要send方法和底层交互才能让客户端的socket标记为断开状态。send速度快客户端还未来的及标记,让客户端误认为还处于链接状态。个人理解

撰写答案

推广链接