当前位置: 首页 > 面试题库 >

使用Java通过TCP发送JSON对象

卢子民
2023-03-14
问题内容

我试图替换在终端中运行的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?我不知道 :(

编辑:这些是我从运行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()

如果有人能回答为什么其他作者无法工作的原因,并解释他们将如何影响发送到html" target="_blank">服务器的数据,那么我很乐意接受这作为解决方案。

    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在末尾添加以确认这一点。



 类似资料:
  • 然而,当我通过UDP实现它时,我错过了这种方法

  • 问题内容: 我想发送以下JSON文本 到Web服务并读取响应。我知道如何读取JSON。问题是上述JSON对象必须以变量名发送。 我该如何从android做到这一点?创建请求对象,设置内容标头等步骤是什么。 问题答案: Android没有用于发送和接收HTTP的特殊代码,您可以使用标准Java代码。我建议使用Android随附的Apache HTTP客户端。这是我用来发送HTTP POST的代码片段

  • 问题内容: 我想将JSON文本{}发送到Web服务并读取响应。我该如何从android做到这一点?创建请求对象,设置内容标头等步骤是什么。 我的代码在这里 我做过什么错误,请纠正我,因为它向我显示了错误的请求错误,但是当我在海报中发帖时,它向我显示了成功200的状态 问题答案: 我这样做 此外,还将Web服务URL作为参数。

  • > 构造函数接受InetSocketAddress和actorref。InetSocketAddress是有意义的(我假设这是目的地),但是actorref是什么?这是我第一次使用akka,但据我了解,ActorRef是另一个演员的引用。既然我的TCP客户端是一个参与者,并且我希望这个TCP参与者与TCP服务器通信,而不是与另一个参与者通信,为什么我要给它一个参与者引用? 伙伴对象中的道具功能是用

  • 问题内容: 我定义一个类,然后设置该类类型的对象。我想将此对象透明地发送到在另一台计算机上运行的另一个Java应用程序。什么是实现这一目标的最佳技术? 问题答案: 您可以使用Java API创建对象流并发送任何可序列化的对象。但您必须注意,这些内容不会通过网络进行加密: 在发送方方面: 在接收端: