PHP:从套接字或STDIN读取



我正在学习PHP的套接字编程,所以我正在尝试一个简单的echo-chat服务器。

我写了一个服务器,它工作。我可以连接两个网猫,当我在一个网猫上写东西时,我在另一个网猫上收到它。现在,我想在PHP中实现NC的功能

我想使用stream_select来查看我是否有STDIN或套接字上的数据,以便将消息从STDIN发送到服务器或从服务器读取传入消息。不幸的是,php手册中的示例没有给我任何提示如何做到这一点。我试图简单地$line = fgets(STDIN)和socket_write($socket, $line),但它不起作用。所以我开始往下看,只想让stream_select在用户输入消息时起作用。

$read = array(STDIN);
$write = NULL;
$exept = NULL;
while(1){
    if(stream_select($read, $write, $exept, 0) > 0)
        echo 'read';
}

PHP警告:stream_select():没有传入流数组/home/user/client.php第18行

但是当我输入var_dump($read)时,它告诉我,这是一个流数组。

array(1) {
  [0]=>
  resource(1) of type (stream)
}

我如何得到stream_select工作?


PS:在Python中我可以做一些类似

的事情
r,w,e = select.select([sys.stdin, sock.fd], [],[])
for input in r:
    if input == sys.stdin:
        #having input on stdin, we can read it now
    if input == sock.fd
        #there is input on socket, lets read it

在PHP中也是一样

我找到了一个解决方案。它似乎工作,当我使用:

$stdin = fopen('php://stdin', 'r');
$read = array($sock, $stdin);
$write = NULL;
$exept = NULL;

而不仅仅是STDIN。尽管php.net说,STDIN已经打开并节省使用$stdin = fopen('php://stdin', 'r');如果您想将其传递给stream_select,则似乎没有。此外,应该使用$sock = fsockopen($host)创建到服务器的套接字;而不是在客户端使用socket_create…我喜欢这种语言,它的合理性和清晰的手册…

下面是一个客户端使用select.

连接回显服务器的工作示例。
<?php
$ip     = '127.0.0.1';
$port   = 1234;
$sock = fsockopen($ip, $port, $errno) or die(
    "(EE) Couldn't connect to $ip:$port ".socket_strerror($errno)."n");
if($sock)
    $connected = TRUE;
$stdin = fopen('php://stdin', 'r'); //open STDIN for reading
while($connected){ //continuous loop monitoring the input streams
    $read = array($sock, $stdin);
    $write = NULL;
    $exept = NULL;
    if (stream_select($read, $write, $exept, 0) > 0){
    //something happened on our monitors. let's see what it is
        foreach ($read as $input => $fd){
            if ($fd == $stdin){ //was it on STDIN?
                $line = fgets($stdin); //then read the line and send it to socket
                fwrite($sock, $line);
            } else { //else was the socket itself, we got something from server
                $line = fgets($sock); //lets read it
                echo $line;
            }
        }
    }
}

相关内容

  • 没有找到相关文章