我正在尝试替换我在终端中运行的 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();
}
该代码还挂在应该读取的while循环上InputStream
,我不知道为什么。我一直在使用 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()
norPrintWriter.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();
}