Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.17;
Скачать: CL | DM;

Вниз

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

 
Knight ©   (2009-11-23 11:07) [0]

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


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

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

function sendtosocket(DataToSend: AnsiString): AnsiString;


 
Knight ©   (2009-11-23 11:43) [2]

А как?

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

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

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

Так?


 
Knight ©   (2009-11-23 11:44) [3]

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


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


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


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


 
Knight ©   (2009-11-23 11:56) [5]

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

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


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


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


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


 
Knight ©   (2009-11-23 13:44) [7]

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

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 13:49) [8]

В топку.


 
Knight ©   (2009-11-23 13:53) [9]

А что? Написано, конечно, кривова-то, но даже так, что-то работает... но можно колбэк функцию прикрутить для отображения прогресса. А у Synapse это есть? Не люблю с собой кучу компонент таскать.


 
Сергей М. ©   (2009-11-23 14:03) [10]


> кривова-то, но даже так, что-то работает


Вот именно "что-то".
Чуть изменились сетевые условия - и все, приехали, нишиша не работает)


> у Synapse это есть?


Да. Прямо на блюдечке.


> Не люблю с собой кучу компонент таскать


Там нет компонентов, там только наследники TObject и глоб.ф-ции


 
Knight ©   (2009-11-24 09:33) [11]


> Сергей М. ©   (23.11.09 14:03) [10]

Пробую переделаться на Synapse... вещь интересная, спасибо ;)


> Да. Прямо на блюдечке.


Можешь подсказать как это там называется, где искать?


 
Сергей М. ©   (2009-11-24 09:47) [12]

см. класс TBlockSocket, события OnMonitor, OnStatus


 
Сергей М. ©   (2009-11-24 09:50) [13]

Кр.того, есть еще полезный колбек TBlockSocket.ОnHeartbeat для периодической "разморозки" вызывающего потока на время выполнения длительной блок.операции.


 
Knight ©   (2009-11-24 09:54) [14]

Спасибо :)


 
Knight ©   (2009-11-24 11:08) [15]

Если я правильно понял, там только класс сокета... то есть сокетный сервер надо писать самому. Так?


 
Сергей М. ©   (2009-11-24 11:31) [16]


> сокетный сервер надо писать самому. Так?


Да.


 
Knight ©   (2009-11-26 22:32) [17]

Может кто таки видел готовый сервер (не http) типа TServerSocket, только на Synapse... не ICS

А то я пока его изобретаю, наделаю гораздо больше косяков чем в  [7] :)


 
Сергей М. ©   (2009-11-26 23:34) [18]


> готовый сервер (не http)


Готовый "не http" у тебя перед носом - TServerSocket.


 
Knight ©   (2009-11-27 05:58) [19]

Спасибо!

Чувствую... пытаюсь ехать не тянет... а ручной тормоз-то не снял :)

TSocketServer на стороне сервера + Synapse на стороне клиента... всё, все вопросы отпали :)


 
Сергей М. ©   (2009-11-27 08:20) [20]


> все вопросы отпали


Сомневаюсь)

Грабли типа [7] ждут тебя и на стороне TSocketServer"а - ты же не захотел раобраться с тонкостями асинхр.режима)


 
Knight ©   (2009-11-29 17:01) [21]

Что можно почитать по разработке протокола обмена между клиентом и сервером? Как это вообще называется в литературе? Запутался...

Я так понимаю, что обычно клиент шлёт запросы строками (типа, PASS, LOGIN, FILE), а сервер отвечает кодами (200, 440, 500 и т.п.)

Или может поможете советом? :)


 
Knight ©   (2009-11-29 17:04) [22]

Только не надо ссылок на чаты... это я сам писал. Тут надо разношёрстные данные передавать с авторизацией, сохранением сессией между подключениями, выдачей данных из базы, файлов и изображений...


 
Anatoly Podgoretsky ©   (2009-11-29 20:05) [23]

> Knight  (29.11.2009 17:01:21)  [21]

Так и называется


 
Knight ©   (2009-11-29 21:33) [24]


> Так и называется

Искал, но никакого объяснения с нуля не нашёл...


 
Knight ©   (2009-11-29 21:57) [25]


> Anatoly Podgoretsky ©   (29.11.09 20:05) [23]

А у Вас в эл. библиотеке есть что на эту тему?


 
DVM ©   (2009-11-29 22:01) [26]


> Я так понимаю, что обычно клиент шлёт запросы строками (типа,
>  PASS, LOGIN, FILE), а сервер отвечает кодами (200, 440,
>  500 и т.п.)

это вовсе необязательно


>  Тут надо разношёрстные данные передавать с авторизацией,
>  сохранением сессией между подключениями, выдачей данных
> из базы, файлов и изображений...

И все это называется HTTP


 
Anatoly Podgoretsky ©   (2009-11-29 22:09) [27]

> Knight  (29.11.2009 21:57:25)  [25]

Обычная разработка протокола, набор команд и набор ответов на каждую программу, возможно еще и последовательность команд и ответов.


 
Anatoly Podgoretsky ©   (2009-11-29 22:10) [28]

> Anatoly Podgoretsky  (29.11.2009 22:09:27)  [27]

Последовательность команд и ответов называется машина состояний.



Страницы: 1 вся ветка

Текущий архив: 2010.01.17;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
3-1233230779
interandry
2009-01-29 15:06
2010.01.17
Суммирование полей


4-1226479042
SpellCaster
2008-11-12 11:37
2010.01.17
Пара вопросов по PopupMenu


15-1257975014
Юрий
2009-11-12 00:30
2010.01.17
С днем рождения ! 12 ноября 2009 четверг


2-1259557867
Androna
2009-11-30 08:11
2010.01.17
Запрет отрисовывки фокуса у TButton


15-1258526556
ZeroDivide
2009-11-18 09:42
2010.01.17
Исключить упоминание о боге из гимна