3

サーバー上の一部のデータをリセットする端末で実行している Netcat コマンドを置き換えようとしています。netcat コマンドは次のようになります。

echo '{"id":1, "method":"object.deleteAll", "params":["subscriber"]} ' | nc x.x.x.x 3994

開発中のアプリケーションからこのコマンドを呼び出せるようにしたいので、Java で実装しようとしています。私はそれに問題がありますが、コマンドはサーバー上で実行されません。

これは私のJavaコードです:

try {
    Socket socket = new Socket("x.x.x.x", 3994);
    String string = "{\"id\":1,\"method\":\"object.deleteAll\",\"params\":[\"subscriber\"]}";
    DataInputStream is = new DataInputStream(socket.getInputStream());
    DataOutputStream os = new DataOutputStream(socket.getOutputStream());
    os.write(string.getBytes());
    os.flush();

    BufferedReader in = new BufferedReader(new InputStreamReader(is));
    String inputLine;
    while ((inputLine = in.readLine()) != null)
        System.out.println(inputLine);

    is.close();
    os.close();

} catch (IOException e) {
    e.printStackTrace();
}

コードはInputStream、を読み取る必要がある while ループでもハングします。理由はわかりません。Wireshark を使用してパケットをキャプチャしましたが、送信されるデータは同じように見えます。

{"id":1,"method":"object.deleteAll","params":["subscriber"]}

おそらく、残りのパケットは同じように形作られていませんが、なぜそれができるのか本当に理解できません. おそらく、間違った方法で文字列をOutputStream?に書き込んでいます。何も思いつきません :(

昨日、問題を正しく理解していなかったときに、このような質問を投稿したことに注意してください: Can't post JSON to server with HTTP Client in Java

編集:これらは、ncコマンドを実行して得られる可能性のある結果です。OutputStream が正しいデータを正しい方法で送信する場合、InputStream に同じメッセージが返されると予想されます。

間違った引数:

{"id":1,"error":{"code":-32602,"message":"Invalid entity type: subscribe"}}

わかりました、成功しました:

{"id":1,"result":100}

削除するものはありません:

{"id":1,"result":0}

うわー、私は本当に知りませんでした。「バッファライター」や「プリントライター」などのいくつかの異なるライターを試してみましたPrintWriterが、それが解決策だったようです。PrintWriter.write()メソッドもメソッドも使用できませんでしたがPrintWriter.print()。私は使用しなければなりませんでしたPrintWriter.println()

他のライターが機能しない理由と、サーバーに送信されるデータにどのように影響するかについて誰かが答えを持っている場合、私はそれを解決策として喜んで受け入れます。

    try {
        Socket socket = new Socket(InetAddress.getByName("x.x.x.x"), 3994);
        String string = "{\"id\":1,\"method\":\"object.deleteAll\",\"params\":[\"subscriber\"]}";
        DataInputStream is = new DataInputStream(socket.getInputStream());
        DataOutputStream os = new DataOutputStream(socket.getOutputStream());
        PrintWriter pw = new PrintWriter(os);
        pw.println(string);
        pw.flush();

        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        String inputLine;
        while ((inputLine = in.readLine()) != null)
            System.out.println(inputLine);

        is.close();
        os.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
4

1 に答える 1

1

サーバーはメッセージの最後に改行を期待していると思います。元のコードを使用して、これを確認するために最後にwrite()追加してみてください。\n

于 2013-02-09T20:31:56.997 に答える