当前位置: 首页 > 知识库问答 >
问题:

从套接字读取HTTP映像响应[已关闭]

全冥夜
2023-03-14
BufferedImage image = ImageIO.read(socket.getInputStream())
ByteArrayInputStream bais = new ByteArrayInputStream(inputStreamcontent.getBytes());
BufferedImage image = ImageIO.read(bais);
ImageIO.write(image, "JPG", otherSocket.getOutputStream();
Exception in thread "pool-1-thread-1" java.lang.IllegalArgumentException: image == null!
at java.desktop/javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
at java.desktop/javax.imageio.ImageIO.getWriter(ImageIO.java:1608)
at java.desktop/javax.imageio.ImageIO.write(ImageIO.java:1594)
at org.sarabit.server.Response.getCompleteResponse(Response.java:64)
at org.sarabit.server.RequestHandler.getResponse(RequestHandler.java:61)
at org.sarabit.server.RequestHandler.handle(RequestHandler.java:37)
at org.sarabit.server.RequestHandler.run(RequestHandler.java:79)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at java.base/java.lang.Thread.run(Thread.java:832)

共有1个答案

崔棋
2023-03-14

为此,您应该使用java.net.url.OpenStream

try (InputStream is = new URL("https://picsum.photos/200/300").openStream()) {
    BufferedImage image = ImageIO.read(is);
    System.out.println(String.format("%d, %d", image.getWidth(), image.getHeight()));
}

如果您使用的是Java>=11,还可以查看Java.net.http.httpclient。它具有发送图像和另一个HTTP请求所需的所有功能。关于阅读部分:

HttpClient client = HttpClient.newBuilder()
        .followRedirects(Redirect.NORMAL)
        .build();
HttpRequest request = HttpRequest.newBuilder()
       .uri(URI.create("https://picsum.photos/200/300"))
       .GET()
       .build();
HttpResponse<InputStream> resp = client.send(request, HttpResponse.BodyHandlers.ofInputStream());
System.out.println(String.format("Status code: %d", resp.statusCode()));

try (InputStream is = resp.body()) {
    BufferedImage image = ImageIO.read(is);
    System.out.println(String.format("%d, %d", image.getWidth(), image.getHeight()));
}

编辑

鉴于您最后的评论,我理解您需要在阅读响应正文之前区分几种可能收到的内容类型。下面是一个示例,如何在每个访问的URI中仅使用一个HTTP请求:

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpClient.Redirect;

import javax.imageio.ImageIO;

public class HttpImage {
    
    public static void main(String[] args) throws Exception {
        
        HttpClient client = HttpClient.newBuilder()
                .followRedirects(Redirect.NORMAL)
                .build();

        //Test image resource
        getResource(client, URI.create("https://picsum.photos/200/300"));

        //Test text/html resource
        getResource(client, URI.create("https://stackoverflow.com/"));
        
    }
    
    public static void getResource(HttpClient client, URI uri) throws IOException, InterruptedException {

        System.out.println("At " + uri);
        HttpRequest request = HttpRequest.newBuilder()
                   .uri(uri)
                   .GET()
                   .build();
        HttpResponse<InputStream> resp = client.send(request, HttpResponse.BodyHandlers.ofInputStream());
        System.out.println(String.format("Status code: %d", resp.statusCode()));
        
        if (resp.statusCode() != 200) {
            throw new IOException("Unexpected HTTP response status " + resp.statusCode());
        }
        
        String contentType = resp.headers().firstValue("Content-type").orElse("text/plain");
        System.out.println("Content-Type header: " + contentType);
        String simpleType = null, encoding = null;
        String[] sepEnc = contentType.split(";");
        if (sepEnc.length > 0) {
            String[] sepType = sepEnc[0].split("/");
            simpleType = sepType[0].trim().toLowerCase();
        }
        if (sepEnc.length > 1) {
            String enc = sepEnc[1].trim().toLowerCase().replaceAll("\\s+", "");
            if (enc.startsWith("charset=")) {
                encoding = enc.substring(8);
            }
        }
        if (simpleType == null)
            simpleType = "text";
        
        System.out.println("Content type: " + simpleType);
        
        try (InputStream is = resp.body()) {
            switch (simpleType) {
            case "image":
                System.out.println("Reading image");
                readImage(is);
                break;
            case "text":
                System.out.println("Reading text");
                readText(is, encoding);
                break;
            }
        }
    }
    
    private static void readImage(InputStream is) throws IOException {
        BufferedImage image = ImageIO.read(is);
        System.out.println(String.format("%d, %d", image.getWidth(), image.getHeight()));
    }
    
    private static void readText(InputStream is, String encoding) throws UnsupportedEncodingException, IOException {
        if (encoding == null)
            encoding = "utf-8";
        try (InputStreamReader sr = new InputStreamReader(is, encoding)) {
            try (OutputStreamWriter ow = new OutputStreamWriter(System.out)) {
                sr.transferTo(ow);
            }
        }
    }

}
 类似资料:
  • 我想从socket读取图像响应,并再次将其传递给另一个socket。但现在我连图像反应都看不懂。

  • 我正在为客户机发送对象到服务器,在服务器端修改该对象,并将其重新发送到客户机。将对象从客户机发送到服务器很好,它工作正常,但当我将对象发送回来时,它给出了异常,Socket关闭。这里是代码。IntString和ParentObj是我要发送对象的类。 服务器类 用于发送和接收对象的Send_recv类。

  • socket_read和socket_recv之间有什么区别?我正在尝试使用PHP套接字,但使用socket_read时收到了以下警告: 请帮帮我!

  • 问题内容: 我有一个侦听某些x端口的套接字。 我可以从客户端应用程序将数据发送到套接字,但是无法从服务器套接字获得任何响应。 ..此代码部分从服务器读取数据。 但是,直到关闭服务器上的套接字,我才能从服务器读取任何内容。服务器代码不受我控制,无法对其进行编辑。 如何从客户端代码中克服这个问题。 谢谢 问题答案: 为了在客户端和服务器之间进行通信,必须明确定义协议。 客户端代码将阻塞,直到从服务器收

  • 问题内容: 我是Go的新手,正在为一个项目进行评估。 我正在尝试编写一个自定义处理程序来为提供文件。我无法使用默认处理程序,因为我需要访问基础套接字(内部),因此可以在其上执行一些信息平台特定的“ syscall”调用(主要是)。 更确切地说:我需要在处理程序函数中访问的基础套接字: 用在 有没有办法做到这一点。我看了看这是怎么做的,但是它使用了“太多”的内容,因为然后我必须在获得的原始tcp套接

  • 我想把我的Android设备(Android4.2.2)与BluetothAdapter创建的另一个Android设备配对。startDiscovery()。我在运行BluetoothDevice时发现了什么。connect()请求配对开始。但我在运行connect()时遇到了问题 我在中尝试了impliment fallback和gatclass方法 IOException:读取失败,套接字可能