2011-12-30 3 views
1

Это то, что я до сих пор,Чтение файла изображения через Java сокет

Socket clientSocket = new Socket(HOST, PORT); 

ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 

InputStream is = socket.getInputStream(); 
byte[] byteChunk = new byte[1024]; 

int c = is.read(byteChunk); 

while (c != -1){ 
    buffer.write(byteChunk, 0, c); 
    c = is.read(byteChunk); 
} 

BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(buffer.toByteArray())); 

Моя проблема с моим код ImageIO.read() возвращает нуль.

Когда я печатаю содержание ByteArrayOutputStream объекта, что я получаю заголовок часть

HTTP/1.1 200 OK 
Date: Fri, 30 Dec 2011 11:34:19 GMT 
Server: Apache/2.2.3 (Debian) ........... 
Last-Modified: Tue, 20 Dec 2011 19:12:23 GMT 
ETag: "502812-490e-4b48ad8d273c0" 
Accept-Ranges: bytes 
Content-Length: 18702 
Connection: close 
Content-Type: image/jpeg 

следует с пустой строкой плюс множество строк с различными символами, такими как Àã$sU,e6‡Í~áŸP;Öã….

Снова моя проблема ImageIO.read() функция возвращает null.

Заранее спасибо.

+0

Поскольку вы, похоже, запрашиваете HTTP, почему бы не использовать реализацию клиента HTTP вместо сырого сокета? – fge

+0

Мне нужно использовать сокеты для практики. –

+0

напечатайте байты изображения и сравните их перед записью и после-чтением. если он соответствует, то в передаче нет проблем. то мы смотрим в других аспектах. –

ответ

2

Почему вы не хотите использовать простой http-адрес для получения изображения с хоста? Я имею в виду:

URL imageURL = new URL("http://host:port/address"); 
BufferedImage bufferedImage = ImageIO.read(imageURL); 

Если вы хотите использовать обычную розетку, вы должны выполнить синтаксический анализ ответа HTTP и извлечения данных из HTTP ответа вручную: чтение/пропустить заголовки, прочитать двоичные данные и передать его в ImageIO.read (или искать поток для исправления положения и прохождения потока до ImageIO.read).

+0

Я ограничен, чтобы использовать простые сокеты. Вы имеете в виду, что мне нужно избавиться от частей HTTP Header, о которых я упоминаю в своем вопросе? –

+0

@nevayeshirazi yep, конечно, вам нужно получить двоичные данные простого изображения, чтобы передать их методу ImageIO.read. – 4ndrew

+0

Хорошо, это имеет смысл. Спасибо за Ваш ответ. –

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