为什么套接字读取不会退出循环?

3
我有一个socket客户端,它可以从服务器读取数据。然而,当没有更多可读取的数据时,它并没有立即离开do...while循环。为什么会这样呢?谢谢。
while (true)
{
    $data_old=$data;
    $data = file_get_contents("userInput.txt");

        if($data_old != $data)
        {
            socket_write($socket, $data, strlen($data));
            do
            {
                $line =@socket_read($socket,2048);
                echo $line. "\n";
            }
            while($line != "");
        }

}

因为当你读取时,你期望有数据吗?使用某种结束标志或其他方式,以便读取知道何时停止或发送空消息。 - Jesus Ramos
1
显然,当没有更多数据可读取时,socket_read()应该返回("")。 - Dayzza
你的程序出现了无限循环或者在最后一次非空数据接收后阻塞在socket_read上了吗? - lazyhammer
你尝试过移除错误抑制运算符并查看输出吗? - Alix Axel
2个回答

1

我相信你的问题在于执行永远不会离开while (true)循环,而不是while($line != ""),请尝试以下代码:

while (true)
{
    $data_old = $data;
    $data = file_get_contents('userInput.txt');

    if ($data_old != $data)
    {
        socket_write($socket, $data, strlen($data));

        while (true)
        {
            $line = @socket_read($socket, 2048);

            echo $line. "\n";

            if ($line == '')
            {
                break 2;
            }
        }
    }
}

如果套接字是非阻塞的,您可能还想使用带有超时的socket_select()

不行,它仍然没有进入($line =='')块。 - Dayzza
@Jonathan:如果你从 socket_read() 调用中删除 @,会发生什么? - Alix Axel

0

我使用另一种方法解决了这个问题。我的服务器在发送完所有数据后向客户端发送一个(“”)语句。

客户端在接收到该语句后将退出该循环。

while (true)
{
    $data_old=$data;
    $data = file_get_contents("userInput.txt");

        if($data_old != $data)
        {
            socket_write($socket, $data, strlen($data));
            do
            {
                $line =@socket_read($socket,2048);
                if($line != " ")
                echo $line. "\n";
            }
            while($line != " ");
        }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接