客户端使用socket_write()定时发送心跳以后,就不能使用socket_recv()接收workerman主动发送的数据

学海无涯

客户端使用socket_write()定时发送心跳以后,就不能使用socket_recv()接收workerman主动发送的数据:
我是使用客户端主动发送数据给workerman的服务器端,下面是代码

do{
    $buff = "";
    if((socket_recv($socket, $buf, 1024, MSG_PEEK)) != false)  chuli($buff);
        $cmd = '{"head":{"heart":"idle"}'."\n";
    if(socket_write($socket, $cmd, strlen($cmd))==false){ 
            echo 'SEND '.date("Y-m-d H:i:s")." ".$cmd."\n";
        connect();  
    }
    sleep(15);
}while(TRUE);

这个只能客户端发送数据,服务端回复一条数据,当服务端主动发送一条数据的时候就无法通过socket_recv()来接收这条主动发送的数据了

4479 2 0
2个回答

six

if((socket_recv($socket, $buf, 1024, MSG_PEEK)) != false)
看了眼php手册,感觉MSG_PEEK应该改成MSG_WAITALL

  • 学海无涯 2018-02-02

    还是不行,服务器发送的数据是可以接收到的,但不是经过socket_recv()来接收的,而是直接输出

学海无涯
do{
    $buff = "";
    //if(socket_recv($socket, $buf, 4096, 0)) chuli($buff);
    if($buff = socket_read($socket, 1024, PHP_NORMAL_READ)) chuli($buff);
    pcntl_signal_dispatch();
    if($g_sessionID != "") {
        $cmd = '{"head":{"heart":"idle"}'."\n";
        if(socket_write($socket, $cmd, strlen($cmd))==false){
            echo 'SEND '.date("Y-m-d H:i:s")." ".$cmd."\n";
            connect();
        }
    }
    sleep(15);
}while(TRUE);

改成上面的这种,是可以,但是服务器主动发送的数据接收时会随着时间的增长而增加

  • 暂无评论
年代过于久远,无法发表回答
🔝