2014-03-25 15 views
1

我的服務器端Dart應用程序從套接字接收JSON字符串。該字符串由Java代碼生成。當該字符串被髮送到Java代碼中的套接字時,它將被編碼爲UTF8,並且兩個字節(短整型)被預置爲該字符串。這個短的值是字符串+ 2中的字節數。Dart如何解析字符串中的字節

我需要將該值作爲int提取以處理字符串,但沒有任何我嘗試過的工作。它死於JSON.decode(下面),因爲它遇到另一個JSON字符串的開始。第二個字符串的第一個字節是第二個JSON字符串長度的開始。這兩個字符串每個都少於40個字符長。

(I需要將長度追加到從達特發送到Java以及字符串。)

爪哇線

out.writeUTF(json); // converts and writes to the socket stream. 

達特服務器端代碼方法

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"} 

回答

0

我不能找到一種方法,這兩個字節的報頭轉換爲整數尤其是因爲一個字節可以是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 
    } 
    }); 

} 
2

所以你總是發送[sizeuper8,sizelower8,..utf8-string ...]作爲你的消息邊界? UTF8解碼不期望長度作爲參數,並將這兩個字節視爲unicode(可能爲null,後跟一個字符)。

我目前工作的一個StreamBuffer的箭袋(https://pub.dartlang.org/packages/quiver),可以讓你管的插座,讓你一個緩衝:

read(2).then((bytes) => read(bytes[1]<<8|bytes[2]).then((string) => UTF8.decode(string)));

您可以可以發佈任何你的字符串解碼就像之後那樣,但是它應該解密您的數據。

拉電流要求(工作正在進行中):https://github.com/google/quiver-dart/pull/117

+0

這就是我認爲的,當Java代碼發送一個字符串並且Dart發回它時它工作正常。然後,我將Java代碼設置爲發送第二個字符串,經過一些計算後,似乎第二個字符串(或上帝禁止 - 的一部分)被附加到第一個字符串。 Java代碼和Dart代碼都將駐留在同一臺計算機上並異步發送字符串,所以我不能排除這種串聯不會發生在最終的應用程序中。我看到Dart支持UDP ... –

+0

我也使用UDP,這將對您的應用程序有意義,此外,您還可以刪除長度編碼! – jtmcdole