我正在尝试使用java.net.Socket
而不是java.net.URL
和外部库下载图像。这是我的,我不知道什么是不工作。如何使用Java套接字HTTP/1.1请求下载图像?
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,... – EJP
@Luis如何获得ImageInputStream?我试过类型铸造'socket.getInputStream',但这是行不通的。 – NonlinearFruit