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

时间:2014-03-17 20:04:29

标签: java json sockets socket.io dart

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

我认为它会死掉,因为字符串是由Java' writeUTF'一个short int的方法,它包含JSON UTF-8中的字节数,不包括前导short和前导字节为0.

  1. 是否有Dart方法可以在每个方向上处理此问题,还是必须编写代码? (我原以为JSON在语言之间很容易运作。)
  2. 在我的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');
    

    }

1 个答案:

答案 0 :(得分:2)

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

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

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