1

編集:私は自分の問題を解決し、誰かが同じ問題に遭遇した場合に備えて、これらの変更を反映するように以下のコードを修正しました。このコードは、PHP クライアントと Java サーバー接続で機能します。

フォーラムにはこれらの質問が山ほどあることは承知していますが、8 時間以上にわたって他のほとんどすべてのことを試しましたが、もう限界です。Java Socket から PHP Socket に文字列を送信しようとしています。私はPHPソケットの初心者なので、誰かが私の問題をかなり簡単に診断できることを願っています.PHPコードは次のとおりです。

<html>

<head>
</head>

<body>
<?php
//connection to NetworkService in app to manage incoming request
$addr = 'your server address';
$port = 1740;

$socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
socket_connect($socket, $addr, $port);

//"\r\n" is very important as it signifies to the server
// that this is the end of the transmission 
$request = "message to send \r\n";

//no flags needed circa php 5.2
$sent = socket_sendto($socket, $request, strlen($request), 0 , $addr, $port);

if($sent !== FALSE){
    $message = '';
    $next = ''; 

    //loop through to continue appending until everything has been read
    while($next = socket_read($socket, 4096)){
        $message .= $next;
    }
    echo $message;
} else{
    echo "Failed.";
}

socket_close($socket);
?>
</body>

</html>

Java コード:

public class TestServer{
    public static void main(String argv[0]) throws Exception{
        String in; String out = "Hello PHP\r\n";
        ServerSocket inSock = new ServerSocket(1740);

        while(true){
            System.out.println("Now accepting connections");
            Socket outSock = inSock.accept();
            BufferedReader bReader = new BufferedReader(
                 new InputStreamReader(outSock.getInputStream()));
            PrintWriter sender = new PrintWriter(outSock.getOutputStream());
            in = bReader.readLine();
            System.out.println("Received: " + in);
            dWriter.print(out);
            System.out.println("Sent: " + out);
        }
    }
}

問題は、最初の送信 (PHP から JAVA への送信) ではなく、ハングする 2 番目の送信 (応答) にあります。Java コードは完全に実行されるので、問題は socket_read() または socket_recv() 関数に関係していることがわかります。私は sleep() を試み、socket_setnoblock() を使用してメソッドを試しました (おそらく間違っています)。私の「OPTION:」コメントからわかるように、ここでもいくつかの異なる方法を試しましたが、役に立ちませんでした。何が欠けている可能性がありますか?よろしくお願いします!

4

2 に答える 2

4

マニュアルによると、socket_recv()受信したバイト数である整数を返します。

問題は、false !==ここでは使用しないでください (socket_recv()整数を返すため) です。この条件で十分です。

while(0 != socket_recv($socket, $out, 1024)){
      if($out != null)
        $fullResult .= $out;
    };

に興味があるかもしれませんsocket_last_error()

于 2013-07-26T15:11:31.180 に答える
2

少し遅れました(別の問題を探してこれに出くわしました。

PHP で、ソケットをノンブロッキングに設定してから、目的の「メッセージの終わり」応答が得られるまでループします (以下が改行の場合、Java に強制的に送信させます)。socket_read を使用することもできます (改行で終わるため) が、以下で使用したコードの場合は次のようになります。

socket_set_nonblock ($socket);
$receiveStartTime = microtime(true);
$response = '';
$retval = false;
while(microtime(true) - $receiveStartTime < 0.5) {
    $n = @socket_recv($socket, $dataIn, 1024, 0);  // Assume max return value is 1024 bytes.
    if ($n) {
        $response .= $dataIn;
    }
    if (strpos($dataIn, "\n") !== false) {
        @socket_clear_error ( $socket );
        $response = str_replace("\n", '', $response);
        break;
    }
}
if (socket_last_error($socket) > 0) {
    $this->lastErrorNum = socket_last_error($socket);
    $this->lastErrorMsg = 'Unable to read from socket: ' . socket_strerror($this->lastErrorNum);
    @socket_clear_error ( $socket );
} else {
    $retval = $response;
}
于 2014-07-01T06:07:46.930 に答える