【问题标题】:Dart - How to receive and decode JSON packet sent from a Java applicationDart - 如何接收和解码从 Java 应用程序发送的 JSON 数据包
【发布时间】:2014-03-17 20:04:29
【问题描述】:

在我的服务器端代码中,我需要能够监听套接字以与同一台机器上的 Java 7 测试应用程序交换 JSON“数据包”。建立连接并由 Java 测试应用程序构造 JSON 字符串并将其写入套接字。它被 Dart 服务器端应用程序接收并传递给一个回调方法,handleJson,它会尝试对其进行解码。该过程在“JSON.decode”上终止。

我认为它死了,因为字符串是由 Java 'writeUTF' 方法预先添加的,该方法带有一个短 int,其中包含 JSON UTF-8 中不包括前导短且前导字节为 0 的字节数。

  1. 是否有一个 Dart 方法来处理这个问题,在每个方向上,还是我必须编写代码? (我原以为 JSON 在语言之间很容易工作。)

在我的 Java 测试应用程序中写入套接字之前的 JSON 字符串:

{"target":"DOOR","command":"OPEN"} // 34 characters

一个Java sn-p:

  // in a try-catch 
Socket client = new Socket(serverName, port);
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);

out.writeUTF(json);

client.close();

Java 文档指出,out.writeUTF 方法将 json 字符串转换为 UTF-8,字符串长度作为包含写入字节总数的短整型前缀。

主要:

ServerSocket.bind('127.0.0.1', 4041)
   .then((serverSocket) {
  print('connected');
      // prints: 'connected'
   serverSocket.listen((socket) {
      socket.transform(UTF8.decoder).listen(handleJson);
   });
});

handleJson 方法:

handleJson(String stringAsJson){
  print('string length is ' + (stringAsJson.length).toString());
    // prints:  'string length is 36' 
  print('received json $stringAsJson');
    // prints: 'received json '
  String json = JSON.decode(stringAsJson);
    // dies on decode
  print('Sever Socket received: $json');

}

【问题讨论】:

    标签: java json sockets socket.io dart


    【解决方案1】:

    这会给你带来一些麻烦,因为 Socket 是原始 TCP,而 TCP 是流式传输的。这意味着您发送的文本(字节)可以以网络认为合适的任何方式进行拆分和合并。

    在您的情况下,您需要一种方法来标记每条 JSON 消息的结尾。一个示例可能是累积所有接收到的字节,直到看到字节 0(在 JSON 中无效)。然后可以将这些字节转换为 UTF8,然后再转换为 JSON。请注意,对等方需要在消息之间发送这个 0 字节,才能正常工作。

    现在,您还考虑使用 WebSockets 作为发送消息的一种方式。在最初的 HTTP 握手之后,它实际上只是一个带有一些额外标头信息的原始 TCP 套接字,以使其面向包 - 正是您所需要的。 dart:io 已经包含一个 WebSocket 实现。

    【讨论】:

    • 最终我希望 Dart 服务器端代码在 Web 套接字上监听客户端(我可以这样做)并且在“常规”套接字上监听数据来自使用 Gson 在同一台计算机上运行的 Java 程序。这是将单击按钮时生成的用户请求传递给 Java 代码以执行操作。 Java 代码响应会以另一种方式传播,我认为 JSON 将是正确的工具。我确实有一个小型 Java 测试程序,可以使用下面的 JohnYates 代码生成 JSON 消息,但我在他的 jsonprint 中的第一行出现错误,表明第一个字符是错误的。
    • 我在重写代码并确定核心问题后重申了这个问题。
    • 我接受了这个答案,因为它让我朝着正确的方向前进。见Solution
    猜你喜欢
    • 2021-10-10
    • 2013-03-14
    • 2018-11-06
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2011-06-25
    相关资源
    最近更新 更多