Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Посылка запроса на удаленный сервер и получение ответа от него [D7, WinXP]


q10nik ©   (2007-05-30 16:09:00) 

Добрый день, попал в весьма затруднительное положение:

имеется файл с http запросами на удаленный сервер,
пусть в примере сервеором будет 127,0,0,1:80


сам запрос, берется из базы
//RMessage:='GET '+Webpage+' HTTP/1.0'#10#10;

procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket:TCustomWinSocket);

begin
Socket.SendText(RMessage);//отправляем запрос
end;
//-----------------------------------------------------
procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);

begin
//выводим пришедший от сервера ответ в мемо
Memo1.Lines.Text := Memo1.Lines.Text + Socket.ReceiveText;

end;

//пытаемся отправить на сервер все запросы из базы запросов
//------------------------------
while not EOF(f) do
begin
 Readln(f,RMessage);
 ClientSocket1.Open;
 ClientSocket1.Close;
 end;
end;
closefile(f);


но таким образом получить ответы на все посылаемые запросы  не получается - приходит ответ только на последний и то не всегда.

Подскажите пожалуйста, каким образом мне с наибольшей скоростью отправить все запросы (всего их около 2000) и получить на них ответы сервера...очень хочется обойти использование ClientSocket, а вместо него использовать что-нить поновее?
От сервера достаточно получить только код 200(Ок) или 404 или 400 и т.д.


  (2007-07-25 13:22:00) [1]

Удалено модератором


G_M_S   (2007-05-31 09:51:00) [2]

TidHTTP спасет отца русской демократии :))) Более того - он позволяет грузить только хидер, т.е. как раз то, что тебе и надо (код ответа там как раз и передается). И реализация работы по HTTP там уже готовая, причем ОЧЕНЬ грамотно написанная - он за тебя будет знать, когда чего отправлять и когда ждать ответ.


Сергей М.   (2007-05-31 09:02:00) [3]


> Client:=TIdTCPClient.Create;// нехватает параметра параметра,
>  поменял на
>
> Client:=TIdTCPClient.Create(idTCPClient1);


Сам-то понял что сделал ?)


q10nik   (2007-05-30 17:30:00) [4]

ура все заработало, просто мне нужно было быть внимательнее
Client.WriteLn и все никаких IOHandler

всем спасибо


q10nik   (2007-05-30 17:17:00) [5]

Client:=TIdTCPClient.Create;// нехватает параметра параметра, поменял на

Client:=TIdTCPClient.Create(idTCPClient1);

try
 Client.Host:=IPAdress.Text;
 Client.Port:=80;
 assignfile(f,'base.db');
 reset(f);
 while not EOF(f) do
 begin
  Readln(f,RMessage);
  try
    Client.Connect;
    Client.IOHandler.Write(RMessage);//Undeclared identifier
{можно заменить на      Client.SendCmd(RMessage);}

    Memo1.Lines.Add(Client.IOHandler.ReadLn);////Undeclared identifier
{можно заменить на      Client.ReadLn(RMessage);}
   finally
     Client.Disconnect;
   end;
  end;
  closefile(f);
finally
 Client.Free;
end;

в таком варианте компилится, но в мемо записываются, угадайте ;) правильно все вторые строчки ответов сервера на каждый мой запрос!!!

Date: Wed, 30 May 2007 13:16:21 GMT
Date: Wed, 30 May 2007 13:16:21 GMT
Date: Wed, 30 May 2007 13:16:21 GMT
Date: Wed, 30 May 2007 13:16:21 GMT
Date: Wed, 30 May 2007 13:16:21 GMT
Date: Wed, 30 May 2007 13:16:21 GMT
Date: Wed, 30 May 2007 13:16:21 GMT
Date: Wed, 30 May 2007 13:16:21 GMT
Date: Wed, 30 May 2007 13:16:21 GMT
Date: Wed, 30 May 2007 13:16:21 GMT
Date: Wed, 30 May 2007 13:16:21 GMT


q10nik   (2007-05-30 17:09:00) [6]

не ленивый я
не работает у меня такой вариант, я его уже пробовал =(


q10nik   (2007-05-30 17:07:00) [7]

Delphi 7.0 Client.IOHandler.W и дальше нет никаких вариантов, вообще ни одного метода начинающегося на W

вариант с  ClientSocket1.ClientType:=ctBlocking; вообще не приходят ответы на запросы, даже единичные, хотя с
ClientSocket1.ClientType:=ctNonBlocking ответы приходят, но как только загоняю в цикл - ничего


SlymRO   (2007-05-30 17:06:00) [8]

ленивый да?
var
 f:textfile;
 Client:TIdTCPClient;
 RMessage,s:string;
 Code:integer;
begin
Client:=TIdTCPClient.Create;
try
  Client.Host:=IPAdress.Text;
  Client.Port:=80;
  assignfile(f,'base.db');
  reset(f);
  k:=0;
  while not EOF(f) do
  begin
   Readln(f,RMessage);
   try
     Client.Connect;
     Client.IOHandler.Write(RMessage);
     Memo1.Lines.Add(Client.IOHandler.ReadLn);
    finally
      Client.Disconnect;
    end;
   end;
   closefile(f);
finally
  Client.Free;
end;
end;


SlymRO   (2007-05-30 17:02:00) [9]

q10nik   (30.05.07 17:00) [11]
клиента нет метода Writeln

Client. IOHandler.WriteLn


q10nik   (2007-05-30 17:00:00) [10]

к сожалению на ДОМАШНЕМ сервере ни один из предложенных вариантов не работает, readln idTCPClient'a возвращает всторую и последующие строки

из сабджа SlymRO
begin
Client:=TIdTCPClient.Create;
try
  Client.Connect('MyProxyHost',3128{MyProxyPort});
  Client.IOHandler.WriteLn(format('CONNECT %s HTTP/1.0',['mail.mail.ru:110']));
  Client.IOHandler.WriteLn;

Create потребовал в параметр компонент!???
и у клиента нет метода Writeln, есть SendCMD, хотя с этим все ок...

возможноли посылать запрос и лишь когда на него получен ответ - посылать следующий?


Сергей М.   (2007-05-30 16:59:00) [11]


> SlymRO ©   (30.05.07 16:54) [9]


В учебно-познавательных целях почему бы и нет ?


SlymRO   (2007-05-30 16:54:00) [12]

Сергей М. ©   (30.05.07 16:51) [8]
Это я вкурсе... не предлогать же бедолаге свой readln делать к сокету


Сергей М.   (2007-05-30 16:51:00) [13]

Кр.того, ни в коем случае нельзя питать себя иллюзиями, что ReceiveText возвратит разом весьответ сервера.


Сергей М.   (2007-05-30 16:48:00) [14]


> SlymRO ©   (30.05.07 16:39) [4]


Та же ошибка.

ReceiveText тут же вернет управление - это неблокирующий метод.


SlymRO   (2007-05-30 16:43:00) [15]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1175272306&n=4


q10nik   (2007-05-30 16:40:00) [16]

и вообще возможно ли использовать для этой цели idTCPClient?
все мои попытки заставить его показать первую строку с ответом
HTTP/1.1 400 Bad Request или похожим на него не удались

т.е. из всего ответа сервера

HTTP/1.1 400 Bad Request
Date: Wed, 30 May 2007 12:39:26 GMT
Server: Apache/1.3.33 (Win32) PHP/4.4.4
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1

1a7
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>400 Bad Request</TITLE>
</HEAD><BODY>
<H1>Bad Request</H1>
Your browser sent a request that this server could not understand.<P>
client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /index.html.es<P>
<HR>
<ADDRESS>Apache/1.3.33 Server at <A HREF="mailto:webmaster@localhost">non-existent-host</A> Port 80</ADDRESS>
</BODY></HTML>

до меня доходит все, кроме самой нужной первой строки...


SlymRO   (2007-05-30 16:39:00) [17]

ClientSocket1Read ненадо, ClientSocket1Connect тоже убери
procedure TForm1.SpeedButton1Click(Sender: TObject);
var f:textfile;
begin
ClientSocket1.Host:=IPAdress.Text;
ClientSocket1.Port:=80;
assignfile(f,'base.db');
reset(f);
k:=0;
ClientSocket1.ClientType:=ctBlocking;
while not EOF(f) do
begin
 Readln(f,RMessage);
 try
   ClientSocket1.Open;
    Socket.SendText(RMessage);
   Memo1.Lines.Add(ClientSocket1.Socket.ReceiveText);
 finally
   ClientSocket1.Close;
 end;
end;
closefile(f);
end;


Сергей М.   (2007-05-30 16:39:00) [18]


> почему мне ответы на запросы приходят пустыми?


Потому что сервер не такой шустрый, как ты)

Ты отправил запрос и тут же желаешь получить ответ (см. ReceiveText).


q10nik   (2007-05-30 16:32:00) [19]

Или я что-то делаю не так, почему мне ответы на запросы приходят пустыми??? хотя если отправлять только один запрос, то все рботает???


procedure TForm1.SpeedButton1Click(Sender: TObject);
var f:textfile;

begin

ClientSocket1.Host:=IPAdress.Text;
ClientSocket1.Port:=80;
assignfile(f,'base.db');
reset(f);
k:=0;
ClientSocket1.ClientType:=ctBlocking;
while not EOF(f) do
begin
  Readln(f,RMessage);
  try
    ClientSocket1.Open;
    Memo1.Lines.Add(ClientSocket1.Socket.ReceiveText);
  finally
    ClientSocket1.Close;
  end;
end;
closefile(f);
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
begin
Memo1.Lines.Add(ClientSocket1.Socket.ReceiveText);
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
Socket.SendText(RMessage);
end;


SlymRO   (2007-05-30 16:14:00) [20]

 ClientSocket1.ClientType:= ctBlocking;
 while not EOF(f) do
 begin
   Readln(f,RMessage);
   try
     ClientSocket1.Open;
     Socket.SendText(RMessage);
     Memo1.Lines.Add(Socket.ReceiveText);
   finally
     ClientSocket1.Close;
   end;
end;
closefile(f);


Наверх

Титульная страница Поиск, карта сайта Написать письмо