2016-09-21 3 views
0
$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 байта, что мне нужно, чтобы получить выше этих байтов. , потому что мне нужно получить больше байт данных здесь Просьба представить один примертолько 8192 байта данных, полученных только от сокета Stream, с использованием php

Заранее спасибо

+0

Я попытался с stream_set_timeout, но получил ту же проблему. Мне нужно SSL-соединение для отправки данных для этой цели. Я использую этот код, если у кого-то есть другая идея, пожалуйста, поделитесь им. или дать решение, чтобы получить полные данные из теста –

+0

Пробовали ли вы какие-либо примеры из Интернета, чтобы получить что-то, что работает? например [здесь] (http://blog.leenix.co.uk/2011/05/howto-php-tcp-serverclient-with-ssl.html) и [здесь] (http://www.devdungeon.com/content/как-использованию SSL-сокеты-PHP). –

+0

Да, я получил этот код из этого примера, я столкнулся с этой проблемой по этому коду –

ответ

0

Вы установили сокет в неблокируемом режиме:

stream_set_blocking ($socket, false); 

В неблокирующем режиме , вы должны дождаться доступности данных в сокете, прежде чем пытаться выполнить операции чтения. PHP предоставляет функцию stream_select для этой цели.

Таким образом, вы должны сделать блокировку сокета или обработать события с помощью stream_select.

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() function

 Смежные вопросы

  • Нет связанных вопросов^_^