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

Dart-如何接收和解码从Java应用程序发送的JSON数据包,java,json,sockets,socket.io,dart,Java,Json,Sockets,Socket.io,Dart,在我的服务器端代码中,我需要能够监听套接字,以便在同一台机器上与Java7测试应用程序交换JSON“数据包”。Java测试应用程序建立连接,构造JSON字符串并将其写入套接字。Dart服务器端应用程序将接收到它,并将其传递给回调方法handleJson,该方法尝试对其进行解码。进程在“JSON.decode”上终止 我认为它死了,因为字符串是由Java“writeUTF”方法预先加上的,带有一个短int,其中包含JSON UTF-8中的字节数,不包含前导短字符,前导字节为0 是否有一个Dart方

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

我认为它死了,因为字符串是由Java“writeUTF”方法预先加上的,带有一个短int,其中包含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');
    

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

    在您的例子中,您需要一种方法来标记每个JSON消息的结尾。例如,可以累加接收到的所有字节,直到看到字节0(在JSON中无效)。然后,这些字节可以转换为UTF8,然后再转换为JSON。请注意,对等方需要在两条消息之间发送此0字节,以使其正常工作


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

    dart:io
    已经包含一个WebSocket实现。

    最终,我希望dart服务器端代码在web套接字上侦听客户端(我可以做到),并在“常规”套接字上侦听来自使用Gson在同一台计算机上运行的Java程序的数据。这是为了将单击按钮时生成的用户请求传递给Java代码以执行操作。Java代码响应将以另一种方式传递,我认为JSON将是正确的工具。我确实有一个小型Java测试程序,可以使用下面的JohnYates代码生成JSON消息,但我在他的jsonprint的第一行中发现一个错误,表明第一个字符不好。在重写代码并确定核心问题后,我重申了这个问题。我接受这个答案,因为它为我指明了正确的方向。看见