在我的服务器端代码中,我需要能够收听套接字以交换JSON'数据包'在同一台计算机上使用Java 7测试应用程序 。建立连接并构造JSON字符串并由Java测试应用程序写入套接字。它由Dart服务器端应用程序接收并传递给回调方法handleJson,后者尝试对其进行解码。该过程终止于JSON.decode'。
我认为它会死掉,因为字符串是由Java' writeUTF'一个short int的方法,它包含JSON UTF-8中的字节数,不包括前导short和前导字节为0.
在我的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,字符串长度前缀为包含写入的总字节数的short int。
主要:
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');
}
答案 0 :(得分:2)
这会给你带来一些麻烦,因为Socket是原始TCP,而TCP是流式传输。这意味着您发送的文本(字节)可以以网络可能认为合适的任何方式进行拆分和合并。
在您的情况下,您需要一种方法来标记每个JSON消息的结尾。一个例子可以是累积所有接收的字节,直到看到字节0(在JSON中无效)。然后可以将这些字节转换为UTF8,然后再转换为JSON。请注意,对等体需要在消息之间发送此0字节,以便工作。
现在,您还考虑使用WebSockets作为发送消息的方式。在初始HTTP握手之后,它实际上只是一个带有一些额外标头信息的原始TCP套接字,以使其面向包 - 正是您需要的。 dart:io
已包含WebSocket实现。