Я написал простой сервер, использующий программирование сокетов 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
Тип содержимого: приложение / сжатый x-zip
PK ‹â: Lmá ^ Л Í test2.wmvì [y <”Ûÿ? 3ÃØ — Ab¸eeË'5K" »± f_B * Å * YÛ • ¥ M5h ± ¯u [(\ · (- ÷ F) ß3ÏÉ½ÝºÝ × ýýñ {Íg ^ ÏûyžóYÏçœçyÎç¼P '> ™ îÝ + ½Žö6A € ;; ýmüH » ãDŸã © ïÍš] Ð4iIJ0Àª3] B € ðÀ¸CôÁ`ä è1ü½¤Ã¬ $ pBi
Полагаю, это просто отображает zip-файл в виде строки с заголовком ответа. Кажется, когда PrintWriter используется перед кодом отправки файла, весь поток вывода используется для отправки строки вместо байтов. Однако, если я добавлю часть кода отправки ответа ПОСЛЕ кода отправки файла, загрузка будет работать правильно, но в браузере не будет распечатано никакого сообщения с ответом, просто пустая страница.