如何使用Java套接字HTTP / 1.1请求下载图像?

非线性水果

我正在尝试使用java.net.Socket不带java.net.URL外部库的图像进行下载这是我所拥有的,我不确定什么不起作用。

        String domain = "www.manchester.edu";
        String path = "/images/default-source/default-album/slide1.jpg";
        Socket socket = new Socket(domain,80);

        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
        out.println("" +
                "Get "+path+" HTTP/1.1\n" +
                "Host: "+domain+"\n"+
                "");
        out.println();
        out.flush();

        BufferedImage image = ImageIO.read(socket.getInputStream());

为了查看流中正在发生的事情,请将该BufferedImage交换为:

    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String inputLine;
    while ((inputLine = in.readLine()) != null && inputLine.trim() != "0") {
       System.out.println(inputLine);
    }

大概该ImageIO.read(...)方法在套接字输入流中不希望使用HTTP标头。但是我不确定如何删除标题。我试着用读取标题行,BufferedReader然后将套接字输入流传递给,ImageIO.read(...)但这没有用。

这是打印的字符串BufferedReader

HTTP/1.1 200 OK
Cache-Control: public, max-age=7776000
Content-Length: 96876
Content-Type: image/jpeg
Expires: Thu, 04 Feb 2016 21:36:46 GMT
Last-Modified: Tue, 15 Sep 2015 14:23:40 GMT
Server: Microsoft-IIS/8.5
content-disposition: inline; filename=slide1.jpg
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 06 Nov 2015 21:36:46 GMT

����...

末尾的不可打印字符似乎表明标题之后是某种图像。但是如何将其转换为ajava.awt.image.BufferedImage或a javafx.scene.image.Image后者有一个接受输入流的构造函数,我已经尝试过了,但是它不起作用(因为http标头?)。这个问题与类似,但是我试图创建一个图像而不是一个文件。

特克

使用BufferedReader有误,原因有两个:

  1. 它将字节转换为String,然后再转换回字节以将其发送到输出流。转换可能(并且可能会)导致数据丢失;
  2. 它解析了太多字节,您无法控制它。

您需要通过手术来解决此问题,创建一个所需大小的字节缓冲区,并使用anInputStream根据自己的条件逐字节读取流。另外,由于您知道HTTP标头的结尾为“ \ r \ n \ r \ n”(或13 10 13 10字节),因此可以扫描自己的缓冲区以查找此模式并采取相应的措施。

最好的选择是将图像下载到文件中,然后使用ImageIO从本地文件中读取图像。

这是允许您通过剪切标题下载图像文件(或任何其他文件)的代码:

    // Initialize the streams.
    final FileOutputStream fileOutputStream = new FileOutputStream(file);
    final InputStream inputStream = socket.getInputStream();

    // Header end flag.
    boolean headerEnded = false;

    byte[] bytes = new byte[2048];
    int length;
    while ((length = inputStream.read(bytes)) != -1) {
        // If the end of the header had already been reached, write the bytes to the file as normal.
        if (headerEnded)
            fileOutputStream.write(bytes, 0, length);

        // This locates the end of the header by comparing the current byte as well as the next 3 bytes
        // with the HTTP header end "\r\n\r\n" (which in integer representation would be 13 10 13 10).
        // If the end of the header is reached, the flag is set to true and the remaining data in the
        // currently buffered byte array is written into the file.
        else {
            for (int i = 0; i < 2045; i++) {
                if (bytes[i] == 13 && bytes[i + 1] == 10 && bytes[i + 2] == 13 && bytes[i + 3] == 10) {
                    headerEnded = true;
                    fileOutputStream.write(bytes, i+4 , 2048-i-4);
                    break;
                }
            }
        }
    }
    inputStream.close();
    fileOutputStream.close();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用套接字的HTTP请求

来自分类Dev

如何在Java中使用相同的套接字连接执行多个HTTP请求?

来自分类Dev

使用null检查Java从套接字读取HTTP请求

来自分类Dev

python套接字如何使用相同的套接字连接正确重定向http / s请求?

来自分类Dev

如何在Java中使用套接字打印/获取传入的HTTP POST请求的有效负载(带有套接字)

来自分类Dev

在C中使用套接字的HTTP请求

来自分类Dev

套接字始终返回-1

来自分类Dev

通过套接字Java下载图像

来自分类Dev

如何继续下载Java文件(套接字)

来自分类Dev

如何继续下载Java文件(套接字)

来自分类Dev

从HTTP请求下载图像触发断点

来自分类Dev

通过1个按钮下载图像

来自分类Dev

使用PIL和请求下载图像

来自分类Dev

使用iojs创建http请求时,如何捕获EHOSTDOWN套接字错误?

来自分类Dev

使用iojs创建http请求时,如何捕获EHOSTDOWN套接字错误?

来自分类Dev

如何启动 1 by 1 ajax 请求

来自分类Dev

离子 1 外部 HTTP 请求

来自分类Dev

Java、HTTP 和套接字:何时停止读取请求但保持套接字打开?

来自分类Dev

Java套接字收到HTTP / 1.1 400错误请求

来自分类Dev

如果工件中不存在请求的版本( abcd ),如何下载以前的构建版本( abcd-1 )

来自分类Dev

在HashLink上使用套接字读取HTTP请求

来自分类Dev

套接字C ++:recv函数返回-1

来自分类Dev

Xmldocument:如何请求ID =“ 1”;

来自分类Dev

使用C语言中的套接字编程下载图像

来自分类Dev

如何从 gen_tcp:accept/1 返回的套接字获取 MAC 地址?

来自分类Dev

使用 setockopt;当套接字从另一侧关闭时,read 返回 0 而不是 -1

来自分类Dev

如何使用多线程从套接字读取请求

来自分类Dev

如何使用UDP套接字传输jpg图像

来自分类Dev

如何使用ZeroMQ通过TCP套接字发送PNG图像?

Related 相关文章

  1. 1

    使用套接字的HTTP请求

  2. 2

    如何在Java中使用相同的套接字连接执行多个HTTP请求?

  3. 3

    使用null检查Java从套接字读取HTTP请求

  4. 4

    python套接字如何使用相同的套接字连接正确重定向http / s请求?

  5. 5

    如何在Java中使用套接字打印/获取传入的HTTP POST请求的有效负载(带有套接字)

  6. 6

    在C中使用套接字的HTTP请求

  7. 7

    套接字始终返回-1

  8. 8

    通过套接字Java下载图像

  9. 9

    如何继续下载Java文件(套接字)

  10. 10

    如何继续下载Java文件(套接字)

  11. 11

    从HTTP请求下载图像触发断点

  12. 12

    通过1个按钮下载图像

  13. 13

    使用PIL和请求下载图像

  14. 14

    使用iojs创建http请求时,如何捕获EHOSTDOWN套接字错误?

  15. 15

    使用iojs创建http请求时,如何捕获EHOSTDOWN套接字错误?

  16. 16

    如何启动 1 by 1 ajax 请求

  17. 17

    离子 1 外部 HTTP 请求

  18. 18

    Java、HTTP 和套接字:何时停止读取请求但保持套接字打开?

  19. 19

    Java套接字收到HTTP / 1.1 400错误请求

  20. 20

    如果工件中不存在请求的版本( abcd ),如何下载以前的构建版本( abcd-1 )

  21. 21

    在HashLink上使用套接字读取HTTP请求

  22. 22

    套接字C ++:recv函数返回-1

  23. 23

    Xmldocument:如何请求ID =“ 1”;

  24. 24

    使用C语言中的套接字编程下载图像

  25. 25

    如何从 gen_tcp:accept/1 返回的套接字获取 MAC 地址?

  26. 26

    使用 setockopt;当套接字从另一侧关闭时,read 返回 0 而不是 -1

  27. 27

    如何使用多线程从套接字读取请求

  28. 28

    如何使用UDP套接字传输jpg图像

  29. 29

    如何使用ZeroMQ通过TCP套接字发送PNG图像?

热门标签

归档