サーバーと通信してデータを送受信できるAndroidアプリを作成するのに少し問題があります。つまり、私のサーバーはQt C ++で書かれており、もちろん、私のアプリはAndroid用の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();
msgは、関数に渡される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の文字列とエンコードに何かがあるかどうか知りたいです。最初は文字列のメモリ割り当てに関係があるのではないかと思っていましたが、サイズを設定することで適切に処理できたと確信しています。