27.05.2010, 20:15
|
|
Let Me Show You
|
|
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
|
|
ну если в цикле ожидать ответ сервера, то сокет должен быть блокируемым, имхо
пример автризации на одном форуме :
PHP код:
unit Unit1;
interface
uses
ScktComp,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
clientsocket: TClientSocket;
request: String;
request_data: String;
savetickcount: Cardinal;
c: Char;
response: String;
username: String;
password: String;
begin
username:='**********';
password:='**********';
clientsocket:=TClientSocket.Create(Self);
try
clientsocket.ClientType:=ctBlocking;
clientsocket.Port:=80;
clientsocket.Host:='forum29.ru';
clientsocket.Open;
try
// post данные
request_data:='vb_login_username='+username+'&vb_login_password='+password+'&cookieuser=1&s=&securitytoken=guest&do=login&vb_login_md5password=&vb_login_md5password_utf=';
// готовим post запрос
request:='';
request:=request+'POST /login.php?do=login HTTP/1.1'+#13#10;
request:=request+'Host: forum29.ru'+#13#10;
request:=request+'Connection: close'+#13#10;
request:=request+'Proxy-Connection: close'+#13#10;
request:=request+'User-Agent: Mozilla/4.0'+#13#10;
request:=request+'Content-Type: application/x-www-form-urlencoded'+#13#10;
request:=request+'Content-Length: '+IntToStr(Length(request_data))+#13#10;
request:=request+#13#10;
// отсылаем серверу
clientsocket.Socket.SendText(request);
clientsocket.Socket.SendText(request_data);
// то что послали серверу
Memo1.Lines.Add(request);
Memo1.Lines.Add(request_data);
Memo1.Lines.Add('--');
// теперь читаем его ответ
// читаем заголовок ответа
// 1 мин таймаут
savetickcount:=GetTickCount;
response:='';
while clientsocket.Socket.Connected and (GetTickCount-savetickcount<60000) do
begin
if clientsocket.Socket.ReceiveLength>0 then
begin
clientsocket.Socket.ReceiveBuf(c, 1);
response:=response+c;
if (Length(response)>=4) and (Copy(response, Length(response)-3, 4)=#13#10#13#10) then Break;
end else Sleep(10);
end;
// вот заголовок
// чтобы собрать куки обрабатываем строки с Set-Cookie
// response можно засунуть в отдельный TStrings, чтобы удобней было его парсить
Memo1.Lines.Add(response);
Memo1.Lines.Add('--');
// читаем страницу
// т.к. этот сервер передает чанками
// Transfer-Encoding: chunked
// ждем ответа макс 10 сек
// либо "руками" обрабатываем чанки и выходим когда все принято
// но это уже совсем другая история
// конечно проще когда есть Content-Length в заголовке, имхо
savetickcount:=GetTickCount;
response:='';
while clientsocket.Socket.Connected and (GetTickCount-savetickcount<10000) do
begin
if clientsocket.Socket.ReceiveLength>0 then
begin
clientsocket.Socket.ReceiveBuf(c, 1);
response:=response+c;
end;
end;
// вот страница
Memo1.Lines.Add(response);
Memo1.Lines.Add('--');
finally
clientsocket.Close;
end;
finally
clientsocket.Free;
end;
end;
end.
|