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

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

HTTP клиент с помощью TClientSocket [WinXP]


Кефир87 ©   (2006-01-11 02:04:00) 

Мне нечего делать и я решил попробовать написать HTTP клиент. Но столкнулся с проблемой... Для тестирования использую Small HTTP Server. В обработчик ClientSocket'а пишу:

procedure TForm1.ClientSocket1Connect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 Socket.SendText('GET / HTTP/1.1'#13#10);
 Socket.SendText('Host: 127.0.0.1'#13#10);
 Socket.SendText('User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0rc2) Gecko/20020512 Netscape/7.0b1'#13#10);
 Socket.SendText('Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mn g,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1'#13#10);
 Socket.SendText('Accept-Language: en-us, en;q=0.50'#13#10);
 Socket.SendText('Accept-Encoding: gzip, deflate, compress;q=0.9'#13#10);
 Socket.SendText('Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66'#13#10);
 Socket.SendText('Keep-Alive: 300'#13#10);
 Socket.SendText('Connection: keep-alive'#13#10);
 Socket.SendText('Referer: http://127.0.0.1/'#13#10);
 Socket.SendText('Pragma: no-cache'#13#10);
 Socket.SendText('Cache-Control: no-cache'#13#10);
end;

Для надежности запрос полностью стырил у Netscape. Именно такой запрос от него приходит на сервер.
Делее в обработчике кнопки просто пишу:

procedure TForm1.Button1Click(Sender: TObject);
begin
 ClientSocket1.Close;
 ClientSocket1.Open;
end;

Запрос приходит на сервер в том виде, какой и должен. Но ответа не приходит, ибо сразу после прихода запроса сервер сообщает Error: Connection aborted!

Что я упустил. Искал в яндексе реализацию. Не нашел.


Digitman   (2006-01-11 14:19:00) [1]


> Кефир87 ©   (11.01.06 14:16) [7]


ну вот это другой коленкор)


Кефир87   (2006-01-11 14:16:00) [2]

Я понял! Это приходил предидущий запрос! Так-как перед тем как послать новый запрос я обрываю соединение, сервер говорил что оно прервано и отображал ту часть запроса которая до неего доша до обрыва. Вот как 8)


Digitman   (2006-01-11 14:08:00) [3]


> Потому что не было окончания запроса


ну и что ?

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


> сразупосле прихода запроса


кто-то с какого-то перепугу рвет соединение, несмотря на то что запрос передан не целиком


Кефир87   (2006-01-11 13:41:00) [4]

Потому что не было окончания запроса... Таймаут может... Главное что теперь все работает и ответ приходит 8) Буду ковыряться дальше 8)


Digitman   (2006-01-11 13:32:00) [5]


> Вопрос закрыт


вряд ли закрыт ..

осталось невыясненным, почему connection aborted


Кефир87   (2006-01-11 13:26:00) [6]


>
> Сервер ждет окончания запроса. У тебя его нет.
> Вот и все.
>
> Socket.SendText('Cache-Control: no-cache'#13#10#13#10);


Спасибо! Вопрос закрыт.


Reindeer Moss Eater   (2006-01-11 10:09:00) [7]

Но ответа не приходит

Сервер ждет окончания запроса. У тебя его нет.
Вот и все.

Socket.SendText('Cache-Control: no-cache'#13#10 #13#10);


Digitman   (2006-01-11 09:05:00) [8]

Какой режим работы клиентского гнезда тобой установлен - ctNonBlocking или ctBlocking ?

Почему не анализируешь результат выполнения вызываемых тобой SendText-методов ?

Где обработка событий OnRead, OnWrite, OnError, OnDisconnect ?


Наверх

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