サーバー上の一部のデータをリセットする端末で実行している 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();
}