【问题标题】:PHP array mysterious behavior as "Undefined index"PHP数组神秘行为为“未定义索引”
【发布时间】:2019-12-09 06:53:54
【问题描述】:

我正在使用 PHP 中的流方法练习套接字编程。 我正在使用 PHP 7.3.11。 我发现了非常意外的错误消息,上面写着“未定义索引”错误,其中

这是我的服务器端代码

 <?php
        error_reporting(E_ALL);
        /* allow the script to hang around waiting for connection.*/
        set_time_limit(0);

        $address = '127.0.0.1';
        $port = 9016;
        $server = stream_socket_server($address .":". $port, $errno, $errorMessage);    
        $req = array( "R004"=>"R004 exist"
    , "R001" => "R001 Ruccess"
    , "R002"=>"R002Rcontinue"
    , "R003"=>"R003 lRquit"
    , "R005"=>"R005 hello");
        $res = array("TT","SOO1", "S002", "S003");
        if ($server === false)
        {
            throw new UnexpectedValueException("Could not bind to socket: $errorMessage");
        }

        echo json_encode($req);

        while($socket = stream_socket_accept($server)){
            $rand = rand(1,3);
            $peer =  stream_socket_get_name($socket, true);
            $pkt = stream_socket_recvfrom($socket, 1500, 0,$peer);
            if( !empty($pkt)){
                $pkt = trim(preg_replace('/\s+/','',$pkt));
                echo "pkt[{$pkt}]";
                echo "EXITS:".array_key_exists($pkt, $req)."\n";
                echo "pkt[{$pkt}]".PHP_EOL;
                echo $req[$pkt].PHP_EOL;
                stream_socket_sendto($socket, $res[$rand], 0, $peer);
            }
            fclose($socket);
            usleep(1000);
        }

        stream_socket_shutdown($server, \STREAM_SHUT_RDWR);

这是我的客户端代码

error_reporting(E_ALL);
set_time_limit(0);

$address = '127.0.0.1';
$port = 9016;

$local = "tcp://{$address}:{$port}";

$socket = stream_socket_client($local, $errno, $errstr, 30);
$c_res = array("S001" => "Success", "S002" => "continue", "S003" => "quit");
$c_req = array("ROO3", "R005", "R002", "R001", "R004");

while ($socket = stream_socket_client($local, $errno, $errstr, 30)) {
    $rand = rand(1, 4);
//    echo "SEND[$c_req[$rand]]" . PHP_EOL;

    $sent = stream_socket_sendto($socket, $c_req[$rand] . PHP_EOL);

    if ($sent > 0) {
        usleep(1000);
        $s_res = stream_socket_recvfrom($socket, 1500, 0, $peer);
//        $s_res = fread($socket, 4096);
        $s_res = trim(preg_replace('/\s+/', '', $s_res));

        echo "c_res[{$s_res}]";
        echo "EXITS:" . array_key_exists($s_res, $c_res) . "\n";
        echo "c_res[{$s_res}]" . PHP_EOL;
        echo $c_res[$s_res] . PHP_EOL;
    }
}

stream_socket_shutdown($socket, STREAM_SHUT_RDWR);

当我在服务器和客户端运行此代码时(服务器先运行,然后客户端运行)

我发现了这种错误信息

PHP Notice:  Undefined index: SOO1 in E:\xampp\htdocs\mave_gen\www\adm\client.php on line 29

我根本不理解这个错误消息,因为除了 S001 之外的所有其他参考都打印正常。 显然,代码中定义了S001。 我在这里想念什么吗?

提前谢谢你。

【问题讨论】:

  • 第 29 行的代码是?

标签: php arrays sockets object


【解决方案1】:

在服务器端代码中的$res = array("TT","SOO1", "S002", "S003"); 中的SOO1 行应该是S001。您在 SOO1 中输入了字母“O”,但根据您的其余代码,它应该是“0”(零)。

并在客户端代码中修改以下代码行

if ($sent > 0) {
        usleep(1000);
        $s_res = stream_socket_recvfrom($socket, 1500, 0, $peer);
//        $s_res = fread($socket, 4096);
        $s_res = trim(preg_replace('/\s+/', '', $s_res));

        echo "c_res[{$s_res}]";
        echo "EXITS:" . array_key_exists($s_res, $c_res) . "\n";
        echo "c_res[{$s_res}]" . PHP_EOL;
        echo $c_res[$s_res] . PHP_EOL;
    }

到下一行

if ($sent > 0) {
        usleep(1000);
        $s_res = stream_socket_recvfrom($socket, 1500, 0, $peer);
        if(!empty($s_res))
        {
//        $s_res = fread($socket, 4096);
        $s_res = trim(preg_replace('/\s+/', '', $s_res));


        echo "c_res[{$s_res}]";
        echo "EXITS:" . array_key_exists($s_res, $c_res) . "\n";
        echo "c_res[{$s_res}]" . PHP_EOL;
        echo $c_res[$s_res] . PHP_EOL;

     }
    }

在这些更改之后,它应该可以工作了。

【讨论】:

  • 这有点尴尬..但我真的很感谢你的帮助~
猜你喜欢
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多