Главная страница
    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.005 c
15-1258322580
POOP
2009-11-16 01:03
2010.01.17
Чем можно уменьшить скорость аудио?


2-1258963629
Knight
2009-11-23 11:07
2010.01.17
Как правильно сделать запрос-ответ...


15-1258559898
Korri
2009-11-18 18:58
2010.01.17
Прнцип нанесения водяных знаков


10-1162481216
Note
2006-11-02 18:26
2010.01.17
COM взаимодействие службы Win32 и пользовательского приложения


15-1258112660
TUser
2009-11-13 14:44
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский