私はJavaソケットプログラミングを使用して単純なサーバーを作成し、ダウンロード用に2つのファイルを提供し、ダウンロードが終了したときにHTML応答を表示することを目的としていました。私が行ったことは、PrintWriter.printまたはDataOutPutStream.writeBytesを使用してhtmlタグと応答文字列を含む文字列をブラウザーに送信し、次にOutputStream.writeを使用して要求されたファイルを送信することです。ブラウザに入力したURLは127.0.0.1/test1.zipのようで、関連するコードフラグメントは次のとおりです。
pout.print("<html>");
pout.print("<head>");
pout.print("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1/\">");
pout.print("<title>Response</title>");
pout.print("</head>");
pout.print("<body>");
pout.print(createResponseHeader(200, fileTypeCode));
pout.print("</body>");
pout.print("</html>");
pout.print(createResponseHeader(200, fileTypeCode));
pout.flush();
byte[] buffer = new byte[client.getSendBufferSize()];
int bytesRead = 0;
System.out.println("Sending...");
while((bytesRead = requestedFile.read(buffer))>-1)
{
out.write(buffer,0,bytesRead);
}
poutはPrintWriterであり、outはOutputStreamです。問題は、127.0.0.1 / test2.zipを使用してファイルをダウンロードしようとすると、ダウンロードできず、代わりに、応答文字列と多くの意味のない文字をブラウザーに出力することです。
HTTP / 1.0 200 OK
接続:閉じる
サーバー:COMP5116割り当てサーバーv0
コンテンツタイプ:application / x-zip-compressed
PK ‹â:Lmá^ЛàÍtest2.wmvì[y <”Ûÿ?3ÃØ—Ab¸eeË'5K"»±f_B*ÃÅ*YÛ•¥M5h±¯u[(\・(-÷F)ß3ÏÉ½ÝºÝ ×ýýñ{Íg^ÏûyžóYÏçœçyÎç¼P'>™îÝ+½Žö6A€;;ýmüH»êt©k]R#*€.G‰µÅRÏøÍLÔóZ;´£åÑvP¹æª@õó”æÇ„ ‹&amp; ïÍš]Ð4iIJ0Àª3]B€ðÀ¸CôÁ`äè1ü½¤Ã¬$pBi
zipファイルを文字列として応答ヘッダーとともに表示するだけだと思います。ファイルを送信するコードの前にPrintWriterを使用すると、出力ストリーム全体がバイトではなく文字列の送信に使用されるようです。ただし、応答を送信するコードの一部をファイルを送信するコードの後に置くと、ダウンロードは正常に機能しますが、応答メッセージがブラウザに出力されず、空白のページだけが出力されます。