java - 使用 Java 通过 TCP 发送 JSON 对象

标签 java json sockets tcp

我正在尝试替换我在终端中运行的 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}

哇,我真的不知道。我尝试了一些不同的 Writer,例如“缓冲写入器”和“打印写入器”,看来 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();
    }

最佳答案

我认为服务器期望在消息末尾换行。尝试将您的原始代码与 write() 一起使用,并在末尾添加 \n 以确认这一点。

关于java - 使用 Java 通过 TCP 发送 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14788002/

相关文章:

Android MapView 不以点为中心

来自 C++ 客户端的 Java DataInputStream readInt() 获得了巨大的值(value)

java - 如何防止Hibernate公式注释在保留字前添加表名?

java - URL 处的 FileNotFoundException

java - 我可以使用 Value 的属性之一作为 HashMap<Key, Value> 中的键吗

java - 行读取器失败取决于缓冲区大小

json - 如何用未知 key 解码json

java - 如果 JSON 字符串具有该变量,是否会为具有 transient 属性的变量分配值?

Java - 使用套接字连接到虚拟机而不是本地主机

linux - epoll - EPOLLET 容易出现竞争条件吗?