Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.039 c
2-1206527869
Gavrila
2008-03-26 13:37
2008.04.20
PopupMenu - определить какой Item вызвал событие OnClik


15-1204502666
Поп Гапон
2008-03-03 03:04
2008.04.20
А как китайцы набирают текст


2-1206641618
AlexDan
2008-03-27 21:13
2008.04.20
Подскажите как строку превратить в массив?


4-1186639228
Classic
2007-08-09 10:00
2008.04.20
Необходимо перехватить момент печати на принтере


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский