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