仅使用php从Stream套接字接收的8192字节数据

时间:2016-09-21 12:53:40

标签: php sockets fread

    $ip="****";     //Set the TCP IP Address to connect too
$port="8088";        //Set the TCP PORT to connect too
$command="hi";       //Command to run
$req['path'] = $path;
$post = json_encode($req);
//Connect to Server
$socket = stream_socket_client("tcp://{$ip}:{$port}", $errno, $errstr, 30);

if($socket) {
 //Start SSL
 stream_set_blocking ($socket, true);
 stream_socket_enable_crypto ($socket, true, STREAM_CRYPTO_METHOD_SSLv3_CLIENT);
 stream_set_blocking ($socket, false);

 //Send a command
 fwrite($socket, $post);


 $buf = null;
 //Receive response from server. Loop until the response is finished
 while (!feof($socket)) {
  $buf .= fread($socket, 20240);
 } 



 //close connection
 fclose($socket);

    echo "<pre>";
    print_r($buf); exit;

 //echo our command response
 return json_decode($buf);
}

这是我的代码。 此代码适用于低于8192字节的值。但 它不能得到我需要超过这个字节的8192个字节。 因为我需要在这里获得更多的字节数据 请提供一个例子

提前致谢

2 个答案:

答案 0 :(得分:0)

您已将套接字设置为非阻塞模式:

stream_set_blocking ($socket, false);

在非阻塞模式下,您应该在尝试执行读取操作之前等待套接字上的数据可用性。 PHP为此提供了stream_select功能。

因此,您应该使用stream_select来阻止套接字,还是处理事件。

答案 1 :(得分:0)

当您写入网络流时,对fwrite()的单个调用无需写入整个数据。

http://php.net/manual/en/function.fwrite.php处有一条说明:

  

写入网络流可能在整个字符串之前结束   书面。可以检查fwrite()的返回值:

<?php
function fwrite_stream($fp, $string) {
    for ($written = 0; $written < strlen($string); $written += $fwrite) {
        $fwrite = fwrite($fp, substr($string, $written));
        if ($fwrite === false) {
            return $written;
        }
    }
    return $written;
}
?>

您可能想知道,这个8192号码来自哪里。

这似乎是流的默认块大小。 您可以通过stream_set_chunk_size()函数

检查和更改块大小