TCPサーバー(私も書いた)に接続し、そこからテキストを送受信するAndroidアプリを書いています。現在、最終読み取り (クライアント側) にバグがあります。
Eclipse でデバッガーを使用すると、送信されたすべてのバイトを受信していることがわかりますが、特定のテキストについては、nバイトを期待している場合、最初のn - k、いくつかの m NUL バイトを取得します。 、そして最後のk - m意味のあるバイト。私が問題を正しく解釈している場合、Java は膨大な量の 0 を見て、後で読み取るのに役立つものは何もないと判断しています (デバッガーはバイト配列とそれが変換された文字列を表示しますが、試してみるとそれを破棄します)さらに検査します)。
NUL の大量流入を無視して、重要なものだけを読むにはどうすればよいでしょうか?
// Find out how many bytes we're expecting back
int count = dis.readInt(); // dis is a DataInputStream
dos.writeInt(count); // dos is a DataOutputStream
// Read that many bytes
byte[] received = new byte[count];
int bytesReceived = 0;
int bytesThisTime = 0;
while (-1 < bytesReceived && bytesReceived < count) {
bytesThisTime = dis.read(received, 0, count);
if (bytesThisTime <= 0) break;
bytesReceived += bytesThisTime;
String bytesToString = new String(received, 0, bytesThisTime, "UTF-8");
sb_in.append(bytesToString);
received = new byte[count];
}
in = sb_in.toString();
書き込みを行っているサーバー コードは次のとおりです。
// Convert the xml into a byte array according to UTF-8 encoding
// We want to know how many bytes we're writing to the client
byte[] xmlBytes = xml.getBytes("UTF-8");
int length = xmlBytes.length;
// Tell the client how many bytes we're going to send
// The client will respond by sending that same number back
dos.writeInt(length);
if (dis.readInt() == length) {
dos.write(xmlBytes, 0, length); // All systems go - write the XML
}
// We're done here
server.close();