【发布时间】:2015-11-06 22:10:31
【问题描述】:
我正在尝试使用 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
����...
末尾的不可打印字符似乎表明标题后面是某种图像。但是我怎样才能把它变成java.awt.image.BufferedImage 或javafx.scene.image.Image?后者有一个接受输入流的构造函数,我已经尝试过了,但它不起作用(因为 http 标头?)。这个问题类似于this 一个,但我正在尝试创建图像而不是文件。
【问题讨论】:
-
你试过用 ImageInputStream 代替 InputStream 吗?
-
为什么?为什么不使用
HttpURLConnection并省去很多麻烦呢? 很多的麻烦。您将不得不处理内容长度、内容编码、HTTP 1.0、... -
@Luis 如何获得 ImageInputStream?我尝试过对
socket.getInputStream进行类型转换,但这不起作用。 -
@EJP 我可以从套接字获取
HttpURLConnection吗?我想避免麻烦,但我想弄清楚如何使用套接字和 HTTP 请求获取图像。 (我的目标是学习) -
不,您不能这样做,您可以从 URL 中获取。关于 ImageInputStream 的建议并没有增加你已经在做的事情。