0

私は現在、HTTP を使用してピアからバイナリ ファイルのチャンクを要求するクラスで思いついた標準の P2P クライアントの作成を含む学校に取り組んでいます。これらのリクエストを行うために Java の HTTP ライブラリを使用することは許可されていますが、これらのライブラリには大きな問題があります。ファイルのすべてのチャンクは <=64KB のチャンクで提供されますが、次のコードを使用すると、応答のコンテンツ長が 64KB であっても、受信する最大バイト数は約 15040 です。

String response = "";

URL url = new URL(uriPath);
URLConnection conn = url.openConnection ();

conn.setConnectTimeout(30 * 1000);
conn.setReadTimeout(30 * 1000);

InputStream stream = conn.getInputStream();
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();

int c;
byte[] buffer = new byte[4096];

while ((c = stream.read(buffer)) != -1)
{
    byteArrayOut.write(buffer,0,c);
}

body = byteArrayOut.toByteArray();


stream.close();
result.put(Constants.HEADER_CONTENT_LENGTH, conn.getHeaderField(Constants.HEADER_CONTENT_LENGTH));
result.put(Constants.HEADER_CONTENT_CHECKSUM, conn.getHeaderField(Constants.HEADER_CONTENT_CHECKSUM));
result.put(Constants.KEY_BODY, new String(body));

サーバー コンポーネントをテストしたところ、wget またはブラウザーでチャンクにアクセスしたときにファイルが正しく提供されました。この Java クライアントは、私たちが見つけた唯一の問題のあるクライアントです。

これは Java の URLConnection クラスの問題ですか、それとも応答で返されるバイナリ ファイルの読み取りに問題があるコードが含まれているのでしょうか?

注: 私は Eclipse とコマンド ラインから Java 1.6 を使用しています。

4

1 に答える 1

1

最大バイト数が 15040 であることをどうやって知ることができますか? byteArrayOut.toByteArray().length または new String(byteArrayOut.toByteArray()).length() を実行しましたか?

バイナリ コンテンツを含むバイト配列から新しい String を作成すると、予期しない結果になる可能性があります。FileOutputStream を使用してファイルを開きます。

于 2011-03-21T15:44:40.273 に答える