4

64 kb サイズのパッケージを取得するサーバーを作成しています。

        int length = 65536;
        byte[] bytes = new byte[length];

        int pos = 0;
        while(pos < length -1)
        {
            System.out.println("Before read");
            pos += dis.read(bytes, pos, length-pos);
            System.out.println(""+pos+" >> "+ length);
        }

これは、ソケットからすべてのバイトを読み取るために使用するコードです。DisですInputStream。コードを実行すると、n のうち 1 が失敗します。このコードは、バイトではなく 52964 バイトしか受け取りません65536

Cコードもチェックしたところ、65536バイトを送信すると書かれています。

誰かが私が間違っていることを知っていますか?

4

4 に答える 4

2

これは、 Jakarta Commons IOUtilsが自分で作成するよりも優れた選択であるもう 1 つのケースです。これは 1 行のコードであり、完全にテストされています。IOUtils.readFully()この場合お勧めします。

バッファ全体を読み取らない場合は、すべてのコンテンツを送信していないことがわかります。おそらく、サーバー側でフラッシュが不足しています。

于 2013-01-10T14:29:26.730 に答える
1

InputStream.read()読み取ったバイト数を返すか、ストリームの終わりに達した場合は -1 を返します。そのエラー状態を確認する必要があります。while(..)また、ループに問題があると思われます。なぜあなたはそれposを位置と呼んでいますか?途中で終了する場合があります。また、C コードが何をしていても、正しく送信されていることを確認してください。確かに、 Wiresharkなどのツールを使用してネットワーク トラフィックを調べることができます。

于 2013-01-10T14:28:58.227 に答える
0

-1 をチェックしないため、コードは正しくありません。

これは、自分でコーディングして間違えるのではなく、DataInputStream.readFully() を使用するケースです。

于 2013-01-10T20:56:23.043 に答える
0

「うまくいかない」ってどういうこと?出力は何ですか?64 KB を完全に読み取る前にループを終了することはできません。

また、I/O が成功したと仮定する前に、I/O 呼び出しの戻り値を個別に保存して検査することをお勧めします。それが の場合、DataInputStream.read()エラーで -1 を返します。

于 2013-01-10T14:26:17.237 に答える