Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Dart如何解析字符串中的字节_Java_Json_String_Sockets_Dart - Fatal编程技术网

Java Dart如何解析字符串中的字节

Java Dart如何解析字符串中的字节,java,json,string,sockets,dart,Java,Json,String,Sockets,Dart,我的服务器端Dart应用程序从套接字接收JSON字符串。该字符串由Java代码生成。当字符串被发送到Java代码中的套接字时,它被编码为UTF8,两个字节(短int)被添加到字符串的前面。此短字符的值是字符串中的字节数+2 我需要将该值提取为int,以便处理字符串,但我尝试过的任何方法都不起作用。它在JSON.decode(如下)处终止,因为它遇到了另一个JSON字符串的开头。第二个字符串的第一个字节是以第二个JSON字符串的长度开头的短字符。这两个字符串的长度均小于40个字符 (我还需要将长度

我的服务器端Dart应用程序从套接字接收JSON字符串。该字符串由Java代码生成。当字符串被发送到Java代码中的套接字时,它被编码为UTF8,两个字节(短int)被添加到字符串的前面。此短字符的值是字符串中的字节数+2

我需要将该值提取为int,以便处理字符串,但我尝试过的任何方法都不起作用。它在JSON.decode(如下)处终止,因为它遇到了另一个JSON字符串的开头。第二个字符串的第一个字节是以第二个JSON字符串的长度开头的短字符。这两个字符串的长度均小于40个字符

(我还需要将长度附加到从Dart发送到Java的字符串中。)

爪哇线

out.writeUTF(json); // converts and writes to the socket stream.
Dart服务器端代码方法

handleJavaSocket(Socket javasocket){
   javasocket.transform(UTF8.decoder).listen((String socketString){
   var truncated = socketString.substring(2);
   String message = JSON.decode(truncated); // dies here
      // more code
   }, onError: (error) {
     print('Bad JavaSocket request');
   });

}
编码前的一个JSON字符串

{"target":"DOOR","command":"OPEN"}

所以您总是以[sizeuper8,sizelower8,…utf8字符串…]作为消息边界发送?UTF8 decode不希望将长度作为参数,而是将两个字节视为unicode(可能为null,后跟一个字符)

我目前正在为Quiver()开发一个StreamBuffer,它可以让您通过管道将套接字连接到一个缓冲区,从而提供:


read(2)。然后((bytes)=>read(bytes[1])我找不到将两个字节的头转换为整数的方法,特别是因为一个字节可以是0,而一些字符串方法将其视为字符串终止符

由于来自Java应用程序的消息总是由消息头和消息头组成,因此我忽略消息头并解析来自流的消息,将它们添加到列表中(以便作为验证回显它们)

然后,我遍历列表并通过将消息大小后面的0字节写入消息后面的流来模拟报头。消息长度大于255时,这将无法正常工作,但我不希望任何字节接近该大小

应该注意的是,Dart应用程序和Java应用程序在同一台机器上

handleJavaSocket(Socket javasocket){
  // echo socket
  javasocket.transform(UTF8.decoder).forEach((item) {
    var start = 2;
    var end = -1;
    var messages = new List<String>();
    while((++end < item.length) && (end = item.indexOf('}',end)) != -1) {
      messages.add(item.substring(start, ++end));
      start = end + 2;
    }
    for(var message in messages) {
      // header message length as two bytes
      javasocket.writeCharCode(0); // max length 254
      javasocket.writeCharCode(message.length); 
      javasocket.write(message); // <== send
    }
  });

}
handleJavaSocket(socketjavasocket){
//回声插座
javasocket.transform(UTF8.decoder).forEach((项){
var启动=2;
var-end=-1;
var messages=新列表();
而((++endjavasocket.write(message);//我就是这么想的,当Java代码发送一个字符串,Dart将其发回时,它工作正常。然后我设置Java代码发送第二个字符串,经过一些计算,但似乎第二个字符串(或上帝禁止,它的一部分)附加到第一个应用程序中。Java代码和Dart代码都将驻留在同一台计算机上,并异步发送字符串,因此我不能排除在最终的应用程序中不会发生这种连接。我看到Dart支持UDP…我也使用UDP,这对您的应用程序来说是有意义的,而且您可以放弃长度编码!