0

単純な HTTP 非同期サーバーとテスト クライアントを作成しようとしています。私のテスト クライアントは、サーバーに対して一連の要求を行いますが、応答を読み取る以外には何もしません。私が直面している問題は、一連の成功した応答の後、クライアントが特定の要求の完全な応答を読み取れないことです。なぜこれが起こっているのか分かりません。

これが私のサーバーの読み取り/書き込みハンドラーです: 読み取り/書き込みハンドラー

重要なコードは、ファイルを送信する関数です。

    public void handleWrite(SelectionKey key) throws IOException {
    client.write(out); // Write the headers to the stream
    if (state == State.SENDING_RESPONSE && out.remaining() == 0) {
        // We are done writing the headers
        if (sendFile && (mapped == null)) {
            // Send the file via direct transfer
            System.err.println("DT: " + fPath + " " + pos + "/" + fileSize);
            long transferred = f.transferTo(pos, fileSize, client);
            pos += transferred;
            System.err.println("DT: " + fPath + " " + pos + "/" + fileSize);
        } else if (mapped != null){
            // Send the file (in mapped from either filesystem or from
            // cache)
            System.err.println("MAPPED: " + fPath + " " + mapped.position() + "/" + mapped.limit());
            written += client.write(mapped);
            System.err.println("MAPPED: " + fPath + " " + written + "/" + mapped.limit());
        }
    }
    if (out.remaining() == 0
            && ((mapped == null && pos == fileSize) || (mapped != null && mapped
                    .remaining() == 0))) {
        // We are done transferring the file!
        System.err.println(pos + " " + fileSize);
        assert (pos == fileSize) || (mapped.position() == mapped.limit()) : "File not sent.";
        // Must reset position if from cache
        if (inCache) {
            mapped.position(0);
        }
        if (sendFile) {
            cache();
            f.close();
            inputStream.close();
        }
        state = State.SOCKET_CLOSED;
        d.getKey(client).cancel();
        client.close();
    }
}

クライアントの応答ハンドラは次のとおりです

重要なコードは読み取り部分です。

        if((sz = header.get("content-length")) != null) {
        bodySize = Integer.parseInt(sz);
        byte[] buff = new byte[bodySize];
        int k = 0, read = 0;
        while((k = connection.getInputStream().read(buff, read, bodySize - read)) != -1 && read < bodySize) {
            read += k;
        }
        assert read == bodySize : "Not all of file read. " + read + " " + bodySize;
    }

応答ハンドラーの下部にあるアサーションは、失敗しているものです。また、サーバーとディスパッチャ自体、およびそれが役立つ場合はクライアントも含めました。 サーバー/ディスパッチャ クライアント

4

1 に答える 1

0
while((k = connection.getInputStream().read(buff, read, bodySize - read)) != -1 && read < bodySize) {
      read += k;

それを捨てて使うDataInputStream.readFully(data).

于 2013-10-18T05:55:20.587 に答える