0

PHP を使用してソケット クライアントを作成しており、Java によって実装されたソケット サーバーに文字列メッセージを投稿したいのですが、PHP ソケット クライアントからデータを投稿しようとすると、Java ソケット サーバーが java.io.StreamCorruptedException Exception でクラッシュします。 . 以下は、PHP ソケット クライアント、Java ソケット サーバー、およびメッセージを投稿したときに発生するエラーのコードです。

$fp = fsockopen("127.0.0.1", 1080, $errno, $errstr, 30);
        if (!$fp) {
            echo "$errstr ($errno)<br />\n";
        } else {
            $out = "hello";
            fwrite($fp, $out);
            while (!feof($fp)) {
                echo fgets($fp, 128);
            }
            fclose($fp);
        }

Java コード

providerSocket = 新しい ServerSocket(1080, 10);

        System.out.println("Waiting for connection");
        connection = providerSocket.accept();
        System.out.println("Connection received from " + connection.getInetAddress().getHostName());

        out = new ObjectOutputStream(connection.getOutputStream());
        out.flush();
        in = new ObjectInputStream(connection.getInputStream());
        sendMessage("Connection successful");


            try{
                message = (String)in.readObject();


                System.out.println("client>" + message);





            }
            catch(ClassNotFoundException classnot){
                System.err.println("Data received in unknown format");
            }

    }
    catch(IOException ioException){
        ioException.printStackTrace();
    }
    finally{
        //4: Closing connection
        try{
            in.close();
            out.close();
            providerSocket.close();
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
    }

私が得たエラー

    java.io.StreamCorruptedException: invalid stream header: 48656C6C
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at Provider.run(Provider.java:37)
    at Provider.main(Provider.java:109)
Exception in thread "main" java.lang.NullPointerException
    at Provider.run(Provider.java:85)
    at Provider.main(Provider.java:109)
4

3 に答える 3

0

いくつかのコメント/提案

  1. ソケットからデータを読み取るために、データを読み取るために別のプロトコルObjectInputStreamを使用するものを使用しています。言い換えれば、読み取られるオブジェクトは、あなたの場合はphpオブジェクトであるJavaオブジェクト(object-input-stream)であると想定しています。最終的にバイトに変換され、ネットワーク経由で送信される文字列 (php オブジェクト) を渡します。

  2. 生のバイト配列connection.getOutputStream()を使用して読み取ることをお勧めします 。次に、このバイト配列を使用して文字列を作成します (バイト配列を受け取る標準​​の String コンストラクターを使用)。

于 2012-08-18T12:44:22.590 に答える
0

Java オブジェクトを送信していないため、間違った InputStream を使用しています。テキストを送信したい場合は、BufferedReader などを使用してください。

ソケット Java チュートリアルを参照してください。

于 2012-08-18T12:39:25.730 に答える
0

実際、あなたはオブジェクトを読んでいますが、これはクライアントがout.writeObject(). あなたの場合、このように書く方が良いです

fwrite($fp, "Hello world!\n"); // note the newline at the end

で行を読みますBufferedReader.readLine()

于 2012-08-18T12:42:03.043 に答える