Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2007, 14:19   #1
phoenix_87
Новичок
Джуниор
 
Регистрация: 09.11.2007
Сообщений: 2
По умолчанию TClientSocket и HTTP - В чем ошибка?!

Здравствуйте. Вопрос касается TClientSocket и HTTP - искал где можно, смотрел примеры, перечитывал синтаксис HTTP/1.1 (1.0) - сил больше нет, не пойму в чем ошибка?! Вот код:
Код:
var
  Domain, Scenery, aHost: ShortString;
....
procedure TForm1.Button1Click(Sender: TObject);
begin
  //соединяемся с удаленным сервером.
  Domain := 'delphikingdom.com';
  aHost := 'delphikingdom.com';
  Scenery := '/';
  ClientSocket1.Host := Domain;
  ClientSocket1.Port := 80;
  ClientSocket1.Open;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  st1, st2, st3: string;
  stOut: string;
  ddBuffer : array[0 .. 19] of Char;
  MySocket: TWinSocketStream;
  CountReadBytes, i: Integer;
begin
  MySocket := TWinSocketStream.Create(Socket, 60000);
  st1 := 'GET ' + Scenery + ' HTTP/1.1' + #10;
  st2 := 'Host: ' + aHost + #10; 
  st3 := '#10#10';
  //посылаем заголовки запроса
  if MySocket.Write(st1, Length(st1)) > 0 then
    if MySocket.Write(st2, Length(st2)) > 0 then
      if MySocket.Write(st3, Length(st3)) > 0 then
        Beep;  //для проверки передаются ли данные - передаются всегда
  //ждем данные
  while not MySocket.WaitForData(100) do
    Application.ProcessMessages;
  stOut := '';
  //считываем не более ~17 Кб.
  repeat
    ddBuffer := '';
    CountReadBytes := MySocket.Read(ddBuffer, 20);
    if CountReadBytes > 0 then 
      for i := 0 to CountReadbytes - 1 do
        StOut := StOut + ddBuffer[i]
    else
    begin
      ClientSocket1.Close;
      Break;
    end;
  until Length(stOut) >= 17000;
  MySocket.Free;
  ShowMessage(StOut);    //выводим то что нам отдал сервер
  ClientSocket1.Close;
end;
Проблема в том, что ответ сервера всегда ЛИБО "HTTP....400 Bad Request...", либо ответа вообще нет! (т.е. далее WaitForData вообще не доходит) - смотря какие адреса вводим в Domain, Scenery. Пробовал разные URLы- закономерности не уловил... Положительного результата еще не было, запрос вроде бы сформирован правильно. Помогите разобраться, пожалуйста!

PS. На форме TClientSocket и TButton. Режим ClientSocket - ctBlocking. Среда Delphi7.
phoenix_87 вне форума Ответить с цитированием
Старый 09.11.2007, 14:37   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Попробуй обращаться не просто на домен а на http://домен
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 09.11.2007, 14:51   #3
phoenix_87
Новичок
Джуниор
 
Регистрация: 09.11.2007
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
Попробуй обращаться не просто на домен а на http://домен
Пробовал, тоже самое. Пробовал по разному - и с www. и без тоже.
phoenix_87 вне форума Ответить с цитированием
Старый 18.06.2008, 18:44   #4
Mangust
Пользователь
 
Регистрация: 18.06.2008
Сообщений: 11
Лампочка

Попробуйте вместо #10 писать #13#10.
Mangust вне форума Ответить с цитированием
Старый 18.06.2008, 19:09   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от Mangust Посмотреть сообщение
Попробуйте вместо #10 писать #13#10.
Попробовать не вредно, но скорее наоборот с #13#10 может глючить.
Somebody вне форума Ответить с цитированием
Старый 18.06.2008, 19:20   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

RFC 2068:
Цитата:
.....................
HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all
protocol elements except the entity-body (see appendix 19.3 for
tolerant applications). The end-of-line marker within an entity-body
is defined by its associated media type, as described in section 3.7.

CRLF = CR LF
.....................
Цитата:
.....................
CR = <US-ASCII CR, carriage return (13)>
LF = <US-ASCII LF, linefeed (10)>
.....................
B_N вне форума Ответить с цитированием
Старый 18.06.2008, 19:53   #7
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Цитата:
HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all
protocol elements except the entity-body
оО Я всегда думал по-другому.
Но на
GET / HTTP/1.1
Host: delphikingdom.com
этот сервер нормально отвечает (как с CRLF, так и с LF), поэтому надо в проге ошибки искать.
Somebody вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Компоненты TServerSocket и TClientSocket Vadim Компоненты Delphi 5 15.03.2010 20:34
TClientSocket - сохранение JRcoker Общие вопросы Delphi 4 03.08.2008 00:37
TClientSocket в потоке BlackOmen Работа с сетью в Delphi 8 27.04.2008 22:19
Проблемка с TClientSocket Yoger Работа с сетью в Delphi 3 20.09.2007 10:40
Проблема с TClientSocket, TServerSocket PLOT_HD Работа с сетью в Delphi 4 11.08.2007 17:03