通过TClientSocket

时间:2016-03-11 17:10:07

标签: 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
  服务器:nginx / 1.8.1
  日期:2016年3月11日星期五16:53:29 GMT
  内容类型:image / png
  内容长度:1248
  连接:保持活力
  P3P:CP =“NOI DEVa TAIa OUR BUS UNI STA”
  最后修改时间:2016年3月11日星期五16:53:29 GMT   到期日:2016年3月11日星期五16:53:29 GMT
  缓存控制:私有,无缓存,无存储,必须重新验证,max-age = 0
  Pragma:no-cache
  
  ‰PNG

我没有在回复中看到图像

1 个答案:

答案 0 :(得分:1)

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

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