java - 通过sockets java下载图片

标签 java sockets download

我正在尝试通过套接字从服务器下载图像。我的代码工作正常,但是当我下载图像时,尺寸正确但图像打不开。我不知道我做错了什么。有什么建议吗?谢谢

     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();     
   }

最佳答案

您需要在所有请求的\n 之前添加一个\r,此外,您应该将输出流刷新到套接字。

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 响应 header 。很明显,这是您不希望图像中出现的信息,您的响应将如下所示:

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 header 。这个想法是在\r\n\r\n 发生之前不写入任何数据。该序列表示 header 响应的结尾,之前的任何数据都不是我们的图像。我知道有一种更简洁的方法可以做到这一点,但这种方法对我来说写起来很快:)

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

关于java - 通过sockets java下载图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19985169/

相关文章:

c++ - WSARecv Hook : prevent packet from being recieved by the executable

php - 内容类型添加额外的 html

bash - 为什么 wget 给我两个不同的总下载时间?

java - java 编码(js 到 java)

java - 如何在Eclipse Tomcat项目中更新Jar/依赖项目?

java - 卡夫卡流DSL : Application lags for windowed aggregation

java - 似乎 Hibernate 超出了连接限制

Java套接字编程: Is it possible for the server socket to initiate a communication?

c - 套接字数据在 TCP/IP 传输期间损坏

html - 使用 cURL 从自动下载页面下载文件