Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > обмен двнными по TCP


Автор: slavonX86 28.1.2006, 23:17
ДЛЯ ОБМЕНА ДАННЫМИ ПО HTTP использую пакет SimpleTCP. Запрос генерирую сам.

Встретился с такой проблемой. Я хочу загрузить PNG картинку с саита. Отправляю запрос и получаю ответ:
Код

HTTP/1.1 200 OK
Date: Sat, 28 Jan 2006 18:17:37 GMT
Server: Apache/1.3.34 (Unix) PHP/4.4.2
X-Powered-By: PHP/4.4.2
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: close
Content-Type: image/png

‰PNG





а вот что показал сниффер:
Код

......жђ .....E.
.Б;[email protected].џoTь’.Гё
Вс.P.У!.5лаdр\P.
д Й“..HTTP/1.1 2
00 OK..Date: Sat
, 28 Jan 2006 18
:04:36 GMT..Serv
er: Apache/1.3.3
4 (Unix) PHP/4.4
.2..X-Powered-By
: PHP/4.4.2..Exp
ires: Thu, 19 No
v 1981 08:52:00 
GMT..Cache-Contr
ol: no-store, no
-cache, must-rev
alidate, post-ch
eck=0, pre-check
=0..Pragma: no-c
ache..Connection
: close..Content
-Type: image/png
....‰PNG........
IHDR............
..ю<б....PLTE...
яяяҐЩџЭ... IDAT.
™cшяяя..b?.х@вы~
..›.B‚X“1..А‘sў&
9.З....IEND®B`‚


Я подумал что глючиный компонент и зделал через TCPClient, но с ним такая же фигня.

! Помогите загрузить картинку !

Автор: Snowy 29.1.2006, 10:11
Код нужен, однако.
Буз кода не понять, что у тебя не так.

Автор: slavonX86 29.1.2006, 10:54
1) TcpClient1.Connect;

2)
Код
     Memo1.Lines.Add('GET / ССЫЛКА_НА_КАРТИНКУ HTTP/1.0');
     Memo1.Lines.Add('Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, */*');
     Memo1.Lines.Add('Referer: XXXXXXXXXXXXXXXXXX');
     Memo1..Lines.Add('UA-CPU: x86 ');
     Memo1.Data.Lines.Add('User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)');
     Memo1.Lines.Add('Host: XXXXXXXXXXXX);
     Memo1.Lines.Add('Connection: Keep-Alive');
     Memo1.Lines.Add('Cookie: wmmail=XXXXXXXXXXXXXXXXXXXXX');
     Memo1.Lines.Add('');


3)
Код
     Memo1.Lines.SaveToStream(Stream);
     TcpClient1.SendStream(Stream);


4)
Далее читаю: TcpClient1.ReceiveBuf


P.S.> Рисунок приходит на компьютер, но ни один (SimpleTCP, TcpClient, ...) сетевой компонент не читает !!!

Автор: Snowy 29.1.2006, 15:42
Цитата(slavonX86 @ 29.1.2006, 10:54 Найти цитируемый пост)

Далее читаю: TcpClient1.ReceiveBuf

Вот как раз это и интересно.
Как именно и куда ты читаешь?
Вся проблемма именно тут.

Автор: slavonX86 29.1.2006, 16:04
Пробовал грузить через: idHTTP1.Get('..........'); БЕЗРЕЗУЛЬТАТНО !!!

Хм, вобще картинки не грузятся !!!

Как можно загрузить картинку с саита ?

Автор: Snowy 29.1.2006, 21:12
Покажи код загрузки.
Все можно загрузить.
Что-то делаешь не так.
Только что... Нужно посмотреть код, как ты загружаешь и куда.
Скорее всего проблемма именно в "куда".

Автор: Rexar 29.1.2006, 22:31
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdAntiFreezeBase, IdAntiFreeze, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    IdAntiFreeze1: TIdAntiFreeze;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  idHTTP1.Request.Host := 'www.rambler.ru';
  idHTTP1.Request.Accept := 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, */*';
  idHTTP1.Host := 'rambler.ru';
  Memo1.Text := idHTTP1.Get('http://images.rambler.ru/head2005/rambler2.gif');
end;

end.



Тут я пытаюсь загрузить картинку с сайта rambler.ru

А в мемо приходит вот такой текст:
Код

GIF89a


А вот что показал сниффер:
Код

......x .....E.
.ÆŸ‘@.2.‹¨Q.BAø
Âë.P.mèÅFŽ9v"fP.
Dp]<..HTTP/1.1 2
00 OK..Server: n
ginx/0.3.15..Dat
e: Sun, 29 Jan 2
006 19:28:48 GMT
..Content-Type: 
image/gif..Conte
nt-Length: 614..
Last-Modified: S
un, 25 Sep 2005 
12:01:33 GMT..Co
nnection: keep-a
live..Keep-Alive
: timeout=20..Ex
pires: Sat, 29 A
pr 2006 19:28:48
 GMT..Cache-Cont
rol: max-age=777
6000..Accept-Ran
ges: bytes....GI
F89a....Õ.....ÿÿ
ÿààâÛÛÝÖÖØÌÌÎùùú
ïïðææçª«¯¨©­¡¢¦Ÿ
 ¤žŸ£¤¥¨´µ¸­®±ÒÓ
ÕÏÐÒÈÉËÅÆÈÁÂĽ¾À
…­ØkœÏüýþÉßò.fµL
“È�Ãç©Òë$ŽÍ.ŠÊaµ
ßçõüûýþÍíü.¤Ü.¬ß
7·ê?¿òC»îB³ãKÉûO
´àQ·âb¿çjÍôtÆè…Ô
ôYÑÿo×þ|Úþ�ßþšäÿ
©äûºëþòúýòóóêëëþ
þþüüüöööÿÿÿ!ù...
.?.,..........ÿÀ
?p(Ü..�.áa..ˆP¨à
Ѩ&.‘jÃQxF‡†ŠÖŠ.
o.ß?.an\³mIÔ.i7,
<�Â.�ZÌ..:B<....
f.C.f.=..8$”..;{
Z.….uZ....7¤¥...
.c..;c....,10¶·.
..cI.«.. &,ÄÅ,..
.žU>TU... Â*ÕÖ*%
 .pU.ªU.<Ó%&))(è
)'&%!®ZÜ... %'(+
+2ûùë,>c.Œ±.àƒ.|
2h(¤1CÆŠ....ÌÔàA
..'ôѨÁ‘#..(b .³
D....N$¬a£¥.Ž3V�
.¨..œ..zˆHñ‚£�ƒ.
8n¼¤..Ë‚g=t0°0è?
..=N.ú2‡.5bæ..`
`‚.>HÄ`‰£lË...P
x‚àÀ�.ß.(@ÀƒDÙ²"
zøªâ B.".ÚX.°ƒ‡�
..âVQp•.M;�.¸�ò.
ò˜.;Ò.@ÀÆr..^4.(
ÙfifÍQt. @�‚..¡£
...;


P.S > т.е. картинка приходит, но не читается.

Автор: N1k 30.1.2006, 09:54
Цитата(Rexar @ 29.1.2006, 22:31 Найти цитируемый пост)

P.S > т.е. картинка приходит, но не читается.

Не читаются ЧЕМ? MEMO?
C чего ты взял что в мемо что-то должно отображаться кроме того что у тебя отображается?
И вообще, каким боком мемо связано с картинкой....

Автор: slavonX86 30.1.2006, 09:58
Птому что это ответ на запрос !!!
Это параметр Data HTTP протокола !!!

Автор: N1k 30.1.2006, 10:02
Цитата(slavonX86 @ 30.1.2006, 09:58 Найти цитируемый пост)

Птому что это ответ на запрос !!!
Это параметр Data HTTP протокола !!!

Но это не текст!!!!!!!!!!
Попробуй сделать это и ты, я надеюсь, все поймешь.
Код

...
var
  s:string;
begin
  s:='qqqqqqqqqqqqqq'+#0+'wwwwwwwwwwwww';
  Memo1.Text:=s;
....

Грузи в картинку.

Автор: Snowy 30.1.2006, 10:17
Цитата(Rexar @ 29.1.2006, 22:31 Найти цитируемый пост)
Memo1.Text := idHTTP1.Get

Ну вот. Как я и говорил, вся проблема в "куда"
Ты пытаешься запихать бинарные данные в текст.
Естественно, что первая текстовая часть проходит нормально.
А вот бинарная часть режется на первом же #0.
Все принимается нормально, просто #0 распознается как конец строки.
Можешь проверить на примере:
Код
  ShowMessage('Мама мыла '+#0+'раму');

Отобразить бинарные данные можно в HEX или сохранить в файл.
Можешь банально получить ответ на запрос в string, а потом все #0 заменить на '0'.
Смотри, что тебе больше подходит.

Автор: slavonX86 30.1.2006, 10:24
Пасиба !!!

Ответ на вопрос я получил, можете закрывать тему !!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)