通过socket来下载图像 [英] Download image through sockets java
问题描述
我正尝试通过套接字从服务器下载图像。我的代码工作正常,但是当我下载图像时,尺寸是正确的,但图像不打开。我不知道我做错了什么任何建议?谢谢
I am trying to download an image from a server through sockets. My code works fine, but when I download the image, the size is correct but the image does not open. I don't know what am I doing wrong. Any suggestion? Thank you
Socket socket = new Socket(servername, 80);
DataOutputStream bw = new DataOutputStream(new DataOutputStream(socket.getOutputStream()));
bw.writeBytes("GET "+filename+" HTTP/1.1\n");
bw.writeBytes("Host: "+servername+":80\n\n");
DataInputStream in = new DataInputStream(socket.getInputStream());
OutputStream dos = new FileOutputStream("testtttt.jpg");
int count;
byte[] buffer = new byte[2048];
while ((count = in.read(buffer)) != -1)
{
dos.write(buffer, 0, count);
dos.flush();
}
dos.close();
System.out.println("image transfer done");
socket.close();
}
推荐答案
您需要添加\\ \在你的所有请求之前,另外你应该将您的输出流冲洗到套接字。
You need to add a \r before your \n on all requests, additionally you should flush your output stream to the socket.
Socket socket = new Socket(servername, 80);
DataOutputStream bw = new DataOutputStream(socket.getOutputStream());
bw.writeBytes("GET "+filename+" HTTP/1.1\r\n");
bw.writeBytes("Host: "+servername+":80\r\n\r\n");
bw.flush();
此外,您将获得一些请求的HTTP响应标头。您的回应如下:
Additionally you will get some HTTP response headers with your request. Obiously this is information you dont want in your image, your response will look something like this:
HTTP/1.1 200 OK
Date: Thu, 14 Nov 2013 18:39:47 GMT
Server: Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7
Accept-Ranges: bytes
ETag: W/"2956-1374616977919"
Last-Modified: Tue, 23 Jul 2013 22:02:57 GMT
Content-Type: image/png;charset=UTF-8
Content-Length: 2956
‰JPG....heres your image data
我刚刚写了这个方法来摆脱发送的HTTP头。这个想法是在\\\\\\\\\\\\\\\\\\\\\\\该序列代表标题响应的结尾,而之前的任何数据都不是我们的图像。我知道有一个更干净的方法来做,但是这样我的写作速度很快:)
I just wrote up this method to get rid of the HTTP headers sent across. The idea is to not write any data before a \r\n\r\n occurrence. That sequence represents the end of the header response and any data before that is not our image. I know there is a cleaner way to do it but this way was fast for me to write :)
OutputStream dos = new FileOutputStream("c:\\testtttt.jpg");
int count;
byte[] buffer = new byte[2048];
boolean eohFound = false;
while ((count = in.read(buffer)) != -1)
{
if(!eohFound){
String string = new String(buffer, 0, count);
int indexOfEOH = string.indexOf("\r\n\r\n");
if(indexOfEOH != -1) {
count = count-indexOfEOH-4;
buffer = string.substring(indexOfEOH+4).getBytes();
eohFound = true;
} else {
count = 0;
}
}
dos.write(buffer, 0, count);
dos.flush();
}
in.close();
dos.close();
您还可以在这里找到类似您的另一个问题:通过套接字手动发送HTTP请求
You can also find another question like yours here: Send HTTP Request manually via socket
这篇关于通过socket来下载图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!