0

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();
4

2 に答える 2

0

交換:

String bytesToString = new String(received, "UTF-8");

と:

String bytesToString = new String(received, 0, bytesThisTime, "UTF-8");

基本的dis.read(received, 0, count)に、0から。までの任意のバイト数を返すことができますcount今回読み取られたバイト数bytesThisTimeを示します。ただし、後で実際に読み取られた部分だけでなく、配列全体を使用します。

ところでInputStreamReader、その場で文字列をデコードするものを使用することを検討してください(ただし、そのcount場合は異なるセマンチンがあります)。IOUtilsさらに、 APIを注意深く読んでください。

于 2012-12-01T19:05:47.770 に答える
0

Java は膨大な量の 0 を見て、後で読み取るのに役立つものは何もないと判断しています。

いいえ、Java はデータをまったく見ていません。

NUL の大量流入を無視して、重要なものだけを読むにはどうすればよいでしょうか?

無視すべき「大量の NUL 流入」はありません。Java はそれを行わず、TCP はそれを行わず、それを行うものは何もありません。

自分のコードにプログラミング エラーがあるだけです。

私はそれらを際限なく詳述することができますが、本質的には、独自のバグに乗ったバージョンで複製しようとするのではなく、 DataInoutStream.readFully() を使用する必要があります。

于 2012-12-02T00:38:05.000 に答える