$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个字节。 因为我需要在这里获得更多的字节数据 请提供一个例子
提前致谢
答案 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()函数
检查和更改块大小