簡體   English   中英

Android Java-DataInputStream從套接字轉換為字符串

[英]Android Java - DataInputStream to String from Socket

我在編寫可以與我的服務器進行通信以發送和接收數據的android應用程序時遇到了一些麻煩。 因此,最重要的是我的服務器是用Qt C ++編寫的,當然,我的應用是用Java編寫的。 使套接字數據具有正確的格式以使雙方都能充分理解,這帶來了許多麻煩。

好吧,我遇到的問題是我的客戶端(java android)可以連接到服務器,發送少量數據,並從服務器接收響應。 服務器發送一個相當大的數據消息,將其轉換為UTF-8字節的數據。

QByteArray sendblock;
QDataStream out(&sendblock, QIODevice::WriteOnly);
out << (quint16)0;
char * data = msg.toUtf8().data();
out.writeRawData(data, msg.toUtf8().length());
out.device()->seek(0);
out << (quint16)(sendblock.size() - sizeof(quint16));
socket.write(sendblock);
socket.waitForBytesWritten();

味精是傳遞給該函數的QString。

在客戶端,當收到消息時,我有:

Log.d("connection", "Waiting for response");
short inSize;
inSize = in.readShort();
Log.d("connection", Integer.toString(inSize)); // the first 2 bytes are the size of the message
byte[] inData = new byte[inSize];//allocate space for the entire message
in.read(inData, 0, inSize); //read the entire message
String resp = new String(inData, 0, inSize, "UTF-8");//cast into a String
Log.d("connection", resp);

因此問題在於,在我的程序的不同實例上,轉換為String的字節在結果上會有所不同。

Log.d打印響應的結果大約是正確格式化為字符串的字符串的1445個字母(2890字節),然后字符串的其余部分最終顯示為“ ??” 字符。

我很少能按預期獲得整個消息,而不會出現“?” 字符。 有時我得到更長的消息長度,正確地轉換為字符串。 在大多數情況下,我只得到正確投射的1445個字母,其余為“ ??” 字符。

我有Windows計算機(也用Qt C ++編寫)的另一個客戶端,該客戶端始終使消息完整,並且沒有此問題,因此我很好奇是否存在與Android字符串和編碼有關的問題,可能導致此問題。 起初,我認為這可能與為Strings分配內存有關,但是我敢肯定我已經通過設置大小正確地處理了。

據我所知,UTF-8編碼和字節數的字節序看起來正確。 我認為您唯一缺少的是您需要在while循環中進行讀取,因為不能保證讀取會填滿數組。 嘗試這樣的事情。 檢查read的返回值以確定實際讀取了多少字節,並保持讀取狀態,直到您擁有'inSize'字節為止。

Log.d("connection", Integer.toString(inSize)); // the first 2 bytes are the size of the message
byte[] inData = new byte[inSize];//allocate space for the entire message

int count = 0;
while (count < inSize)
{
   int len = in.read(inData, count, inSize - count);
   count += len;
}
String resp = new String(inData, 0, inSize, "UTF-8");//cast into a String
Log.d("connection", resp);

您將需要擴展此代碼並處理len為-1表示流已關閉的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM