![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно сделать запрос-ответ...
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;