Как создать HTTP-ответ, отправляющий изображение на JAVA?

#java #image #http #webserver #response

#java #изображение #http #веб-сервер #ответ

Вопрос:

У меня возникли некоторые проблемы с написанием базового веб-сервера на JAVA. В настоящее время он отлично работает при доставке файлов html или css. Но когда дело доходит до изображений, все идет наперекосяк. Я предполагаю, что я делаю что-то не так при чтении файлов изображений и подготовке их к отправке. Но взгляните на код:

 public void launch()
{
    while(true)
    {
        try
        {
             Socket connection = this.server_socket.accept();

             ...

             PrintWriter print_writer = new PrintWriter(connection.getOutputStream());

             String response = this.readFile(this.request_header.get("Resource"));
             print_writer.print(response);

             print_writer.flush();
             connection.close();
         }
         catch(...)
         {
             ...
         }
    }
}

private String readFile(String path)
{
    try
    {
         ...

         FileInputStream file_input_stream = new FileInputStream(path);         
         int bytes = file_input_stream.available();
         byte[] response_body = new byte[bytes];

         file_input_stream.read(response_body);
         this.response_body = new String(response_body);

         file_input_stream.close();

         this.setResponseHeader(200, file_ext);

         this.response_header = this.response_header   "rnrn"   this.response_body;
    }
    catch(...)
    {
         ...
    }

    return this.response_header;
}
 

Итак, мой браузер получает что-то вроде:

 HTTP/1.0 200 OK
Content-type: image/jpeg

[String that was read in readFile()]
 

Но chrome неправильно отображает изображение, и opera не покажет все это! Раньше я читал файл с помощью BufferedReader, но я обнаружил, что кто-то сказал, что BufferedReader не может правильно обрабатывать двоичные данные, поэтому я попробовал с FileInputStream, но проблема осталась прежней):

Заранее спасибо за любые советы и помощь (:

Ответ №1:

Вы должны использовать потоки с обеих сторон: входной поток и выходной поток. Читатели и авторы предполагают, что содержимое является Unicode, и вносят коррективы в поток байтов. PrintWriter — это, конечно, писатель.