3

以下は、私のソケット接続要求と応答の順序です。

$socket = socket_create(AF_INET, SOCK_STREAM, 0);
$connection = socket_connect($socket, $Host, $Port);
$Md5CheckSum = md5($msg); 
$WillWait = 'SOAP  '. $Md5CheckSum. '  WILL_WAIT'."\n";
socket_write($socket,$WillWait);                        
socket_write($socket,$msg);
socket_write($socket,  SoapSender::$TERM_CHAR);
sleep(1);
$buf = socket_read($socket, 2048);
//socket_write($socket,"&\r\n");
echo "$buf\n";

最後の socket_write リクエストの後に受け取ったレスポンスの読み方を教えてください。私は一日中この答えを探していましたが、Googleで助けを見つけることができませんでした.

お時間をいただきありがとうございます。

4

2 に答える 2

0

2つの関数を使用する必要があります。

stream_set_blocking($socket, true);

stream_get_contents($socket);

ストリームにブロックを設定するには、アプリケーションがスクリプトの実行を続行する前にデータを返す必要があります。

ストリームブロックを設定しないと、レイテンシーによってPHPスクリプトが応答がないと見なし、データを受信できなくなることがあります。

また、stream_get_contentsを使用してソケットからプルします。これはデフォルトでフルバッファを取得します。

于 2012-06-14T18:16:48.913 に答える
-1

正しい方法は、他の誰かが提案したように、stream_get_contests ではなく、socket_read を使用することです。

以下に例を示します。

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

$result = socket_connect($sock, "10.197.24.40", "5000");

$request = '{ "request" : { "id" : "some_function_id",  "data": "55555555-5"} }';

// We send the request
socket_write($sock,$request);

socket_read($sock,1000000);

socket_close($sock);

このコードをライブ環境でテストしたところ、正しく動作しました。

于 2012-11-29T16:18:25.323 に答える