1

問題

クライアントからのデータがすべて送信されていること、およびサーバーが受信しているデータも完全に送信されていることをパケットスニファーで確認しましたが、わずかな問題があります。

以下は、サーバー内のクライアント スレッドの関連部分の基本的な表現です。

this.data_in = new DataInputStream(sock.getInputStream());
this.in = new InputStreamReader(this.data_in);

サーバーは BufferedReader を使用して認証データを読み込み、認証が完了するとソケットからデータを読み込みます。変数「fos」は、DataInputStream データが書き込まれる FileOutputStream です。

int read = 0;
byte[] buffer = new byte[8192];
while((read = data_in.read(buffer)) != -1) {
    fos.write(buffer, 0, read);
    bytes_received += read;
}

これは概念的にはすべて正しいように見えますが、実際には読み込まれたファイルの最初の 1450 バイトが欠落しています。ストリーム内の位置が奇妙だったが、まだうまくいかなかった場合に備えて、新しい DataInputStream(sock.getInputStream()) を使用してみました。助けてくれてありがとう!

更新 1

そのため、BufferedReader 機能を使用することができました。以前に使用していたように、文字列行を読み取るメソッドを作成しました。以下のコードを参照してください。

int input;
boolean run = true;
while((input = in.read()) != -1 && run) {
    run = true;
    char[] chars = Character.toChars(input);
    for(char c : chars) {
        if(c == '\n') {
            run = false;
            break;
        } else if(c != '\r') {
            sb.append(c);
        }
    }
}

素晴らしい解決策のように見えましたが、まだ 1450 バイトの情報が不足しています。多分私はここで間違った方向に進んでいますか?

4

2 に答える 2

1

同じものを参照する2つの別々のストリーム/リーダーを保持しているようです:this.data_inthis.in. いずれかから読み取るとストリームが進み、もう一方から読み取ると、もう一方で読み取られたデータが「欠落」しているように見えます。また、read(byte[])メソッドを使用して、通常の古い InputStream と同じようにDataInputStreamを使用しています。DataInputStream は、特定の目的を持つ特殊なストリームです。

于 2011-07-28T00:26:40.897 に答える
1

私にBufferedReaderは問題があるように見えます-http: //ulibgcj.sourceforge.net/javadoc/java/io/BufferedReader.htmlによると、デフォルトのバッファサイズは8192です...このデフォルトのバッファサイズがあなたの場合に関係なく、そのデフォルトのバッファサイズのステップでBufferedReader進みdata_inます...したがって、それらを消費しなくても、data_in通常、認証中に消費した最後のバイトを超えた位置にあります。

于 2011-07-28T00:32:53.190 に答える