sockets - 通过TClientSocket从网站加载图像

标签 sockets delphi tclientsocket

我尝试通过 TClientSocket 从网站加载图像。我不会使用TClinetSocket来做到这一点,并且不会像INDY或其他组件那样使用其他组件来做到这一点。

  SckServer.Close;
  SckServer.port:=80;
  SckServer.Address:='127.0.0.1';
  SckServer.Open;

  procedure TForm1.Button3Click(Sender: TObject);
  begin
    img_url:='/img/logo.png';

    SckServer.Socket.SendText(
      'GET '+img_url+' HTTP/1.1' + #13#10 +
      'Host: localhost.com' + #13#10 +
      'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021204' + #13#10 +
      'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1' + #13#10 +
      'Accept-Language: en-us, en;q=0.50' + #13#10 +
      'Accept-Encoding: gzip, deflate, compress;q=0.9' + #13#10 +
      'Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66' + #13#10 +
      'Keep-Alive: 300' + #13#10 +
      'Connection: keep-alive' + #13#10 +
      'Cache-Control: max-age=0' +#13#10 +
      'Referer: http://localhost.com'+ #13#10 +
      #13#10
    );      
  end;

  procedure TForm1.SckServerRead(Sender: TObject; Socket: TCustomWinSocket);
  begin
    form1.caption:='Ready';
    s:= s+SckServer.Socket.ReceiveText;

    s:=StringReplace(s, #10, '', [rfReplaceAll]);
    s:=StringReplace(s, #13, '', [rfReplaceAll]);
    s:=StringReplace(s, '¶', '', [rfReplaceAll]);

    memo1.Lines.Add(s);
  end;

回应文字为

HTTP/1.1 200 OK
Server: nginx/1.8.1
Date: Fri, 11 Mar 2016 16:53:29 GMT
Content-Type: image/png
Content-Length: 1248
Connection: keep-alive
P3P: CP="NOI DEVa TAIa OUR BUS UNI STA"
Last-Modified: Fri, 11 Mar 2016 16:53:29 GMT
Expires: Fri, 11 Mar 2016 16:53:29 GMT
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0
Pragma: no-cache

‰PNG



而且我没有在响应中看到图像

最佳答案

图像是二进制数据,TMemo无法显示图像。

您的客户代码需要先读取HTTP header ,然后解析它们以发现字节大小和传输格式,然后将HTTP响应主体的二进制有效负载(在这种情况下,由Content-Length header 指示为1248个字节)读取为字节数组或流,然后可以使用它来使用TPngImage或类似的类来创建图像。

关于sockets - 通过TClientSocket从网站加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35946043/

相关文章:

linux - Linux 中的 SO_WIFI_STATUS 套接字选项

Delphi — TClientSocket ReceiveText MaxLen?

performance - 填充大量 3D 形状时 FMX ViewPort3D 性能下降

Delphi Pascal - 使用 SetFilePointerEx 和 GetFileSizeEx,在读取文件时获取物理媒体的确切大小

c - 无法在套接字客户端接收正确的数据

c++ - 为什么不推荐使用 TClientSocket 和 TServerSocket,我应该改用什么?

java - 在java中的客户端服务器套接字中将字符串转换为int

c - 通过有效负载以外的方法在 Linux UDP 套接字之间交换任意数据

java - 当一条消息在没有读取 java 流的情况下到达服务器时会发生什么?

delphi - TBCDField 和 TfmtBCDfield 类型不匹配以及 Oracle 兼容性问题