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

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

Как правильно сделать запрос-ответ...


Страницы:   1 2

Knight ©   (2009-11-23 11:07:00) 

... между TServerSocket-TClientSocket. т.е. наподобие indyHTTP.get(url), вызвал data:=sendtosocket('что-то') и в data ответ сервера или ошибка связи, таймаута.


Сергей М.   (2009-11-23 13:49:00) [21]

В топку.


Knight   (2009-11-23 13:44:00) [22]

Во.. набросок между делом сделал.. даже что-то работает.

unit Unit2;

interface

uses Forms, SysUtils, ScktComp;

type
 PSocketData=^TSocketData;
 TSocketData=record
   TimeBegin:TDateTime;
   Command,
   Text:String;
 end;

 TProgress=procedure(Value:Integer) of object;

 TMySock=class(TClientSocket)
 private
   procedure ClientSocket1Write(Sender: TObject; Socket: TCustomWinSocket);
   procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
     ErrorEvent: TErrorEvent; var ErrorCode: Integer);
   procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
 public
   TimeOut:Integer;
   function Send(Text:String; Progress:TProgress):String;
 end;

implementation

uses DateUtils;

{ TMySock }

procedure TMySock.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
 ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
 PSocketData(Socket.Data)^.Text:='ERROR - '+IntToStr(ErrorCode);
end;

procedure TMySock.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
 PSocketData(Socket.Data)^.Text:=Socket.ReceiveText;
end;

procedure TMySock.ClientSocket1Write(Sender: TObject; Socket: TCustomWinSocket);
begin
 Socket.SendText(PSocketData(Socket.Data)^.Command);
end;

function TMySock.Send(Text: String; progress: TProgress): String;
var
 P:PSocketData;
begin
 New(P);
 P^.TimeBegin:=Now;
 P^.Command:=Text;
 P^.Text:='';
 Socket.Data:=P;
 onRead:=ClientSocket1Read;
 onError:=ClientSocket1Error;
 onWrite:=ClientSocket1Write;
 Open;
 while (MilliSecondsBetween(PSocketData(Socket.Data)^.TimeBegin,Now)<=TimeOut) and (PSocketData(Socket.Data)^.Text='') do begin
   Application.ProcessMessages;
 end;

 Close;

 if PSocketData(Socket.Data)^.Text='' then
   Result:='Timeout...'
 else
   Result:=PSocketData(Socket.Data)^.Text;
end;

end.


Сергей М.   (2009-11-23 12:09:00) [23]


> Knight ©   (23.11.09 11:56) [5]


Я бы не выеживался с TClientSocket, а взял бы готовое решение для HTTP-клиента, например, клиент в составе Synapse


Knight   (2009-11-23 11:56:00) [24]

"Всё гениальное просто".
"Если решение слишком сложное, то что-то Вы делаете не так".

Я не сказал, что это ПРАВИЛЬНО, я об этом спросил. И последовал совету, но т.к. не уверен в правильности решения, поэтому спросил ещё раз :)


Сергей М.   (2009-11-23 11:51:00) [25]


> "дёшего и сердито"


Какое отношение это имеет к "правильно" ?


Knight   (2009-11-23 11:44:00) [26]

Пока это единственная мысль с позиции "дёшего и сердито" :)


Knight   (2009-11-23 11:43:00) [27]

А как?

Сделать record, привязать его к сокету, а в него сохранить время отправки запроса и ответ сервера.

написать
function sendtosocket(DataToSend: AnsiString): AnsiString;

Проверять тут в цикле после отправки запроса таймаут по разнице (текущее время-время начала) и появления ответа сервера в привязанном recode, который заполняется в onRead.

Так?


Сергей М.   (2009-11-23 11:25:00) [28]

Правильным будет самостоятельное написание функции

function sendtosocket(DataToSend: AnsiString): AnsiString;


Страницы:   1 2

Наверх

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