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

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

Помогите с TClientSocket, замучался уже... [D7]


ppcumax ©   (2007-04-14 13:09:00) 

ну что я делаю не правильно, я просто хочу получить HTML код страницы в Memo1

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ScktComp;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   Skt: TClientSocket;
   procedure Button1Click(Sender: TObject);
   procedure SktRead(Sender: TObject; Socket: TCustomWinSocket);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Skt.Host := 'vingrad.ru';
Skt.Port := 80;
Skt.Open;
end;

procedure TForm1.SktRead(Sender: TObject; Socket: TCustomWinSocket);
begin
Memo1.Lines.Text := Memo1.Lines.Text + Socket.ReceiveText;
end;

end.


Romm   (2007-04-14 16:03:00) [1]

Не забудьте задать правильный адрес сервера в объекте Socket
не забыл?


ppcumax   (2007-04-14 15:01:00) [2]

у меня этот пример не работает, точнее если index.html на локалхосте, тогда работает, а  какая-то страница в интернете - не хочет. Bad Request


Romm   (2007-04-14 14:52:00) [3]

{
Присоедините следующий обработчик к Вашему TClientSocket.
Он получает файл с сервера и помещает его в строковую переменную
FText string variable. Однако он не убирает заголовок, который
так же посылается вебсервером.

Не забудьте задать правильный адрес сервера в объекте Socket.
Установите порт 80. А затем откройте его при помощи команды
"Socket.Open;".

Автор: E.J.Molendijk
}

const
 WebPage = '/index.html';
var
 FText: string;

procedure TForm1.SocketWrite(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 Socket.SendText('GET ' + Webpage + ' HTTP/1.0'#10#10);
end;

procedure TForm1.SocketRead(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 FText := FText + Socket.ReceiveText
end;

procedure TForm1.SocketConnecting(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 FText := '';
end;

procedure TForm1.SocketDisconnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 { --- }
 { ЗДЕСЬ ВЫ МОЖЕТЕ ОБРАБАТЫВАТЬ ВАШ FText !!! }
 { --- }
end;

procedure TForm1.SocketError(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
 var ErrorCode: Integer);
begin
 ErrorCode := 0; { Ошибки игнорируем }
end;


ppcumax   (2007-04-14 14:24:00) [4]

>что-то начали терзать смутные сомнения, а уж не сканнер ли ты собрался делать?

нет, не сканер

привожу полный код

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ScktComp, StdCtrls;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   Button1: TButton;
   ClientSocket1: TClientSocket;
   procedure Button1Click(Sender: TObject);
   procedure ClientSocket1Write(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Host := 'rambler.ru';
ClientSocket1.Port := 80;
ClientSocket1.Open;
end;

procedure TForm1.ClientSocket1Write(Sender: TObject;
 Socket: TCustomWinSocket);
begin
Socket.SendText('GET / /HTTP/1.1' + #13#10);
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
begin
Memo1.Text := Memo1.Text + Socket.ReceiveText;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ClientSocket1.Close;
end;

end.


ppcumax   (2007-04-14 14:19:00) [5]

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Host := 'rambler.ru';
ClientSocket1.Port := 80;
ClientSocket1.Open;
end;

procedure TForm1.ClientSocket1Write(Sender: TObject;
 Socket: TCustomWinSocket);
begin
Socket.SendText('GET / /HTTP/1.1' + #13#10);
end;

результат тотже


grisme   (2007-04-14 14:02:00) [6]

товарищчь, нужно завершать запросы HTTP-протокола ПАРОЙ CRLF(#13#10), а у тебя ниодной ;)

по поводу сокетов. динамически создавать объекты класса TClientSocket и все )

что-то начали терзать смутные сомнения, а уж не сканнер ли ты собрался делать? :P


ppcumax   (2007-04-14 13:55:00) [7]

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Host := 'rambler.ru';
ClientSocket1.Port := 80;
ClientSocket1.Open;
end;

procedure TForm1.ClientSocket1Write(Sender: TObject;
 Socket: TCustomWinSocket);
begin
Socket.SendText('GET / /HTTP/1.1');
end;

в ответ получаю:

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/0.5.17</center>
</body>
</html>

а, и еще вопрос, как можно одновременно запустить несколько сокетов


grisme   (2007-04-14 13:52:00) [8]

т.е. ты подключился уже к рамблеру(отлов exceptions опустим), не надо ему говорить еще раз, что хочешь к рамблеру в гости. прикинь, приходишь в гости к другу и сообщаешь ему что хочешь в гости к Имя_Фамилия_друга :) достаточно просто запросить корень на HTTP-сервере, а корень и есть "/"


grisme   (2007-04-14 13:49:00) [9]

хе хе ) http://rambler.ru/- это адрес для браузера. у тебя СВОЙ "браузер", т.е. то, что ты подключаешься к 80 порту и есть то самое http:// , а то что ты прописал в ClientSocket1.Host - это и есть это rambler.ru ) сделай запрос таким:
GET / /HTTP/1.1
ты получишь главную страницу rambler.


ppcumax   (2007-04-14 13:36:00) [10]

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Host := 'rambler.ru';
ClientSocket1.Port := 80;
ClientSocket1.Open;
end;

procedure TForm1.ClientSocket1Write(Sender: TObject;
 Socket: TCustomWinSocket);
begin
Socket.SendText('GET http://rambler.ru/HTTP 1.1'#10);
end;

сделал так, но все равно не работает, выдает:

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/0.5.17</center>
</body>
</html>


grisme   (2007-04-14 13:20:00) [11]

а запрос кто будет посылать? ) нужно отправить такую строку "GET / /HTTP/1.1"+Сhr(13)+Chr(10)+Chr(13)+Chr(10) это для index-страницы, которая лежит в корне хоста. для других, первый слеш превратится в путь


Наверх

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