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)
为此,您应该使用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:读取失败,套接字可能