0

TCP/IP を使用して Java で記述されたサーバーに接続しています。私のアプリケーションは json 配列をこのサーバーに送信し、場合によっては、json 配列の結果も予期します。問題は、tcp経由でjsonを簡単に送信できることですが、それを読み取ると、スクリプトがフリーズし、タイムアウトするまで永遠に待機します。これが私のコードです。

$sock = socket_create(AF_INET, SOCK_STREAM, 0)  //Creating a TCP socket
                or die("error: could not create socket\n");
        $succ = socket_connect($sock, Application_Model_Config::serverHost, Application_Model_Config::serverPort)   //Connecting to to server using that socket
                or die("error: could not connect to host\n");

        socket_write($sock, $send.'\n', strlen($send)+1);

        $response = '';
        while ($resp = socket_read($sock, 1024)) {
            if (!$resp)
                break;
            $response .= $resp;
            if (strpos($resp, "\n") !== false)
                break;
        }

        echo "Server said: {$response}";
    }

$send は、json_encode($array) としてエンコードされた配列です。

送信は問題ありませんが、受信する必要があるときに何も取得しません。

可能であれば、jquery(サーバーからjsonオブジェクトを送信および取得する)を使用してこれを処理してもかまいません。私はこのようなことを達成する実装を認識していませんが、私は提案を受け入れています...実際にはphpの代わりにそれを好むでしょう.

4

1 に答える 1

1

使用しているモードsocket_readでは、次と同じセマンティクスがありrecvます。

ソケットで使用可能なメッセージがない場合、ソケットが非ブロッキングである場合を除いて、受信呼び出しはメッセージの到着を待機します(を参照fcntl(2))。この場合、値-1が返され、外部変数errnoがに設定されEAGAINます。受信呼び出しは通常、要求された全額の受信を待つのではなく、要求された量までの利用可能なデータを返します。

したがって、スクリプトが「タイムアウトするまで永久に待機している」場合は、読み取るデータがないためです。これは、パケットスニファで確認できます。

于 2011-05-16T10:26:20.913 に答える