我正在尝试通过套接字从服务器下载图像。我的代码工作正常,但是当我下载图像时,大小正确但图像无法打开。我不知道我做错了什么。有什么建议吗?谢谢
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();
}
答案 0 :(得分:2)
您需要在\ n \ n之前在所有请求之前添加\ r \ n,另外您应该将输出流刷新到套接字。
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响应标头。很明显,这是您在图片中不需要的信息,您的回答将如下所示:
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标头。我们的想法是在\ r \ n \ n \ n \ n \ n发生之前不写入任何数据。该序列表示标头响应的结束,之前的任何数据都不是我们的图像。我知道有一种更清洁的方法可以做到这一点,但这种方式对我来说写得很快:)。
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();
您还可以在此处找到与您类似的其他问题:Send HTTP Request manually via socket
答案 1 :(得分:1)
我的声誉不足以发表评论,因此必须开始新的答案 ug __的答案很棒,但行
buffer = string.substring(indexOfEOH+4).getBytes();
有一些问题,缓冲区会被破坏。例如,
byte[] before = new byte[]{(byte)0xf1, (byte)0xf2, (byte)0xf3, (byte)0xf4};
String str = new String(before, 0, before.length);
byte[] after = str.getBytes();
before
和after
不一样。
所以我稍微修改了ug __的代码:
OutputStream dos = new FileOutputStream("test.jpg");
int count, offset;
byte[] buffer = new byte[2048];
boolean eohFound = false;
while ((count = in.read(buffer)) != -1)
{
offset = 0;
if(!eohFound){
String string = new String(buffer, 0, count);
int indexOfEOH = string.indexOf("\r\n\r\n");
if(indexOfEOH != -1) {
count = count-indexOfEOH-4;
offset = indexOfEOH+4;
eohFound = true;
} else {
count = 0;
}
}
dos.write(buffer, offset, count);
dos.flush();
}
in.close();
dos.close();