在我的服务器端代码中,我需要能够监听套接字,以便与同一台计算机上的 Java 7 测试应用程序交换 JSON“数据包”。。 Java 测试应用程序建立连接并构建 JSON 字符串并将其写入套接字。它由 Dart 服务器端应用程序接收并传递给回调方法,handleJson,该方法尝试对其进行解码。该进程在“JSON.decode”处终止。
我认为它消失是因为 Java 'writeUTF' 方法在字符串前面添加了一个短整型,其中包含 JSON UTF-8 中的字节数,不包括前导短整型,并且前导字节为 0。
- 是否有一个 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/