Прочитайте файл изображения через сокет Java - PullRequest
1 голос
/ 30 декабря 2011

Это то, что я имею до сих пор,

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() функция возвращает ноль.

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

1 Ответ

2 голосов
/ 30 декабря 2011

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

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

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

...