java - Dart - 如何接收和解码从 Java 应用程序发送的 JSON 数据包

标签 java json sockets socket.io dart

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

我认为它消失是因为 Java 'writeUTF' 方法在字符串前面添加了一个短整型,其中包含 JSON UTF-8 中的字节数,不包括前导短整型,并且前导字节为 0。

  1. 是否有一个 Dart 方法可以在各个方向上处理这个问题,或者我必须编写代码? (我原以为 JSON 可以轻松地在不同语言之间工作。)

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

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

Java 片段:

  // 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');

}

最佳答案

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

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

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

关于java - Dart - 如何接收和解码从 Java 应用程序发送的 JSON 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22464219/

相关文章:

java - 将 SQL 计数设置为 java 中的变量

java - 为什么我会收到此扫描仪错误?

json - 在浏览器中将 JSON 字符串解释为 JavaScript 对象时是否存在潜在的 XSS?

java - 如何在我的列表中的 simple_list_item_multiple_choice 中设置选中的 ="checked"项,如果我希望始终选中 2 个元素?

java - if 后面应该跟 else

Python,将 mongodump 的 bson 输出转换为 json 对象数组(字典)

c# - 将用户身份从 MVC 传递到 Web Api

c++ - 我可以使用非阻塞套接字使用 "sendmsg/recvmsg"将 FD 从一个进程发送到另一个进程吗?

python - 服务器连接问题 : "socket.gaierror: [Errno 11004] getaddrinfo failed"

python - 如何让Python的socket服务器永远运行