Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.20;
Скачать: CL | DM;

Вниз

Посылка запроса на удаленный сервер и получение ответа от него   Найти похожие ветки 

 
q10nik   (2007-05-30 16:09) [0]

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

имеется файл с 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 и т.д.


 
SlymRO ©   (2007-05-30 16:14) [1]

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


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

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


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;


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


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


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

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


 
SlymRO ©   (2007-05-30 16:39) [4]

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;


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

и вообще возможно ли использовать для этой цели 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:43) [6]

http://delphimaster.net/view/6-1175272306/


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


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


Та же ошибка.

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


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

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


 
SlymRO ©   (2007-05-30 16:54) [9]

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


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


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


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


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

к сожалению на ДОМАШНЕМ сервере ни один из предложенных вариантов не работает, 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, хотя с этим все ок...

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


 
SlymRO ©   (2007-05-30 17:02) [12]

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

Client.IOHandler.WriteLn


 
SlymRO ©   (2007-05-30 17:06) [13]

ленивый да?
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;


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

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

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


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

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


 
q10nik   (2007-05-30 17:17) [16]

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:30) [17]

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

всем спасибо


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


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


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


 
G_M_S ©   (2007-05-31 09:51) [19]

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


 
имя   (2007-07-25 13:22) [20]

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



Страницы: 1 вся ветка

Текущий архив: 2008.04.20;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.019 c
2-1206700051
gefest80
2008-03-28 13:27
2008.04.20
позиция курсора в TEdit или TMaskEdit


2-1206039059
Riply
2008-03-20 21:50
2008.04.20
Работа с памятью. ( Выравнивание )


2-1206307378
batya-x
2008-03-24 00:22
2008.04.20
TrackBar и OnClick


2-1206708622
asdf2
2008-03-28 15:50
2008.04.20
DataSet


11-1188223121
Ned
2007-08-27 17:58
2008.04.20
Консольные приложения