Форум: "Начинающим";
Текущий архив: 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