Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > socket закачать несколько страниц


Автор: Alabay 5.10.2008, 15:54
Не могу разобраться как с помощью TcpSocket'a закачать несколько страниц - допустим сначала получить текст ya.ru, а потом, как текст скачался загрузить страницу mail.ru и по окончанию загрузки сделать действие, например вывести окно, что все скачалось. Документацию смотрел, но видимо что-то не понял, ибо на англ языке все.., подскажите пожалуйста как решить данную проблему. На Indy тоже ничего не получилось, и к тому же он тяжелый.

Автор: SneG0K 5.10.2008, 16:13
Ну сайты можно вполне получать с помощью IdHttp.
А инди не сложный, то ты просто не читал! 

Автор: Alabay 5.10.2008, 17:13
да тяжелый я имел ввиду про библиотеку саму - большая она))
http - это IdHttp

var lData: TStringList;
    s:string;
begin
  lData.Add('email=121@mail.ru');
  lData.Add('pass=GfHjy7Y');
  Memo1.Lines.Text := http.Post('http://vkontakte.ru/login.php', lData);

выводит ошибку. Нужно что-либо ставить в настройках IdHttp?

Автор: SneG0K 5.10.2008, 20:59
Ээээ.... Ты конешно великодушно нас извини, телепаты в отпуске, но какую ошибку?

Автор: Alabay 9.10.2008, 23:12
Ошибка про Access violation.. про память чето..
вот нашел более-менее пример, только разобраться не могу.. даже с комментами.. гг, аж ламмером себя чувствую))

как взаимосвязаны TClientSocket и TWinSocketStream?

Код

Var Sock : TClientSocket;
    Stream : TWinSocketStream;
    S, Stmp : String;
Begin
  Sock.ClientType := ctBlocking;
  Stream := TWinSocketStream.Create(Sock.Socket,60000);
  Sock.Host := 'www.example.com';
  Sock.Port := 80;
  Sock.Open;
  S := 'GET / HTTP/1.0'#13#10+  // Готовим запрос
       'Host: www.example.com'#13#10+
       'Cookie: name1=value1; name2=value2; name3=value3'#13#10+
       'Connection: Close'#13#10#13#10;
  Sock.Socket.SendBuf(S[1],Length(S));  // Отправляем запрос
  S := '';
  While True do
  Begin
    If Stream.WaitForData(50) then  // Ждем очередной пакет
    Begin
      L := ClientSocket.Socket.ReceiveLength;
      If L=0 then  // Дисконнект
      Begin
        Break;  // Значит все данные приняты... прервать цикл
      End;
      SetLength(Stmp,L);  // Готовим буфер для нового пакета
      Sock.Socket.ReciveBuf(Stmp[1],L);  // Получаем очередные данные
      S := S + Stmp;  // И добавляем их к уже полученным
  End;
  // И обрабатываем переменную S
End;

В коде есть пара ошибок, но исправив их все равно ничего не получается(((

Автор: Matematik 10.10.2008, 11:04
Alabay, 
Код

procedure TForm1.Button1Click(Sender: TObject);
Var Sock : TClientSocket;
    Stream : TWinSocketStream;
    S, Stmp : String;
    L : Integer;
Begin
  Sock := TClientSocket.Create(nil);
  try
    Sock.ClientType := ctBlocking;
    Stream := TWinSocketStream.Create(Sock.Socket,60000);
    Sock.Host := 'www.example.com';
    Sock.Port := 80;
    Sock.Open;
    S := 'GET / HTTP/1.0'#13#10+  // Готовим запрос
         'Host: www.example.com'#13#10+
         'Cookie: name1=value1; name2=value2; name3=value3'#13#10+
         'Connection: Close'#13#10#13#10;
    Sock.Socket.SendBuf(S[1],Length(S));  // Отправляем запрос
    S := '';
    While True do
    Begin
      If Stream.WaitForData(50) then  // Ждем очередной пакет
      Begin
        L := Sock.Socket.ReceiveLength;
        If L=0 then  // Дисконнект
        Begin
          Break;  // Значит все данные приняты... прервать цикл
        End;
        SetLength(Stmp,L);  // Готовим буфер для нового пакета
        Sock.Socket.ReceiveBuf(Stmp[1],L);  // Получаем очередные данные
        S := S + Stmp;  // И добавляем их к уже полученным
      End;
    // И обрабатываем переменную S
    End;
  finally
    Sock.Free;
  end;
  ShowMessage(s);
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)