Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.006 c
2-1258556612
niro
2009-11-18 18:03
2010.01.17
перехватить событие от msie


15-1258625959
Magedon
2009-11-19 13:19
2010.01.17
Изибражения в БД. За и против.


2-1259156997
Анна
2009-11-25 16:49
2010.01.17
Событие в DBGrid или в DataSet ??


15-1258188830
И. Павел
2009-11-14 11:53
2010.01.17
Позиционирование в JavaScript


15-1258409069
DillerXX
2009-11-17 01:04
2010.01.17
как скачать несколько десятков файлов?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский