2016-10-23 2 views
0

Я пишу HTTP-сервер для забавы с нуля (пытаясь узнать HTTP больше indepth) и получил сервер для отправки клиенту HTTP-ответа с HTML без большой вопрос.Отправка изображений (или двоичных данных) поверх сокетов в Java

Проблема возникает, когда я пытаюсь отправить двоичные данные, такие как изображение JPEG по проводу. Возможно, браузер не интерпретирует его правильно. Я установил для MIME-типа свой ответ на image/jpeg, и вместе с правильным Content-Length я все еще не могу правильно передать данные.

Немного тупик в этом вопросе, и мне было интересно, может быть, мое понимание или подход к чтению двоичных данных на Java неверно?

Общий подход, который я делаю, это чтение файла с диска в FileInputStream, а затем чтение данных в буфер с 1024 байтами. Когда я читаю в буфер, я пишу буферизованные данные в DataOutputStream, у которого есть соединение сокета клиента как OutputStream. Я сбрасываю и закрываю данные после использования.

Часть, в которой я генерируя мое тело для моего ответа HTTP здесь:

 FileInputStream fis = new FileInputStream("www/server.jpg"); 
     byte[] buffer = new byte[1024]; 
     DataOutputStream dos = new DataOutputStream(this.clientSocket.getOutputStream()); 
     int read; 
     while((read=fis.read(buffer)) >= 0) { 
      dos.write(buffer, 0, read); 
     } 

     dos.flush(); 

     fis.close(); 
     dos.close(); 

Я жёстко несколько вещей, но я думаю, что это вообще получает мой вопрос в поперечнике. Поэтому, когда я сделать запрос HTTP, показанный ниже, я получаю следующий ответ:

enter image description here

И в FireFox образ пытается вынести, но я получаю сообщение: enter image description here

Образ Я хочу для отображения: enter image description here

У кого-нибудь есть идеи?

Спасибо!

+1

Загрузить файл по URL-адресу с помощью wget/curl и выполнить двоичное сравнение с исходным файлом – rkosegi

+0

Ничего себе, это было удивительно проницательно и полезно haha. Проблема заключалась в том, что у моего тела ответа был добавлен новый символ линии, вставленный перед моим телом, из-за которого браузер неправильно интерпретировал данные. После удаления этой страницы моя страница отображается правильно! – urbanspr1nter

ответ

0

Итак, комментарий @ rkosegi о загрузке файла с curl помог мне разобраться, в чем проблема. По-видимому, я неправильно строил тело ответа. Случилось так, что появилась новая строка, вставленная перед содержимым тела после моих заголовков объектов HTTP. После удаления этой дополнительной строки перед потоковой передачей содержимого тела я смог правильно интерпретировать данные браузера.

D'oh!

Смежные вопросы