创建tcp异步连接 发送send 是不是统一发送?

我创建tcp后 里面循环发送某些指令, 想顺便send返回一些进度条的信息给前段, 但是我发现是统一返回的, 是闭包结束后统一send 的吗, 或者是有什么解决办法?

1260 2 0
2个回答

six

感觉 $con->close() 不能for放循环里吧,第一次循环就close了,那下次循环send就没有意义了,发不出去了

  • 2021-12-16

    哦哦 我把close 放出去, 但是 $connection->send 也是循环完后 统一发的....

  • 2021-12-16

    测试下来 好像跟闭包又没有关系, 我单独循环 $connection->send 也是统一发出来10条,,,并不是我延迟4秒一次...

walkor

业务代码和workerman内核是运行在同一个进程的。如果workerman内核得不到运行控制权,就无法完成握手、发送数据这些操作。所以不要用运行sleep,使用定时器来代替sleep。正确的代码类似这样

<?php
require 'vendor/autoload.php';

use Workerman\Worker;
use Workerman\Timer;

$worker = new Worker('websocket://127.0.0.1:8000');
$worker->onWebSocketConnect = function($con){
    for ($i=1; $i<=5; $i++) {
        Timer::add($i, function()use($con){
           $con->send('1');
        }, null, false);
    }
};
Worker::runAll();
  • 2021-12-16

    ok 我去实验下~

  • 2021-12-16

    那我在创建异步的 $con->onConnect = function($con)use(){} 闭包内循环 $con->send() 我为什么感觉只能发送第一条? for(){ $con->send(str)} $con->close();这样的

  • walkor 2021-12-16

    不要靠感觉,发了多少可以抓包看。

  • 2021-12-16

    我在tcp异步的闭包 循环 for(){ $con->send(str)} $con->close();一条也发不出去, for(){ $con->send(str);$con->close();}这样反而可以发出去一条.....有方法解决吗

  • walkor 2021-12-16

    需要抓包看,数据是否发送出去,连接是否断开了,哪一端断开的。先确定哪一端问题,再解决。

  • 2021-12-16

    咋抓tcp 的 我的是 socket的服务 创建tcp异步 tcp的连接是别人机器的ip+端口, 只抓我socket端口的吗

  • 2021-12-16

    我的是个 win的服务器...tcpdump没有这个...

  • walkor 2021-12-16

    百度windows 抓包

  • 2021-12-17

    昨天我那个 把发送socekt跟异步tcp的 放进定时器 都可以循环发出了, 这种方案可行吗? 或者又什么更好的建议?

  • walkor 2021-12-17

    可行

年代过于久远,无法发表回答
🔝