Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Исправить простейшую программу на Indy, [Indy 10,CodeGear]


Urvin ©   (2008-02-06 17:17:00) 

Друзья! Помогите!

Путем недолгих рассуждений понял, что мне будет очень комфортно работать с Indy.
А вот понять как правильно сделать я никак не могу.

Как мог (по книжке), сделал клиент-серверную связь на Indy:
Клиент:

function TForm1.TCP_Connect(msg: string): boolean;
begin
 result:=false;

 idTcp.Host:=edtHost.Text;
 idTCP.Port:=StrToInt(edtPort.Text);

 try
   idTCP.Connect;
 finally
   try
     idTCP.GetResponse(200);

     idTCP.SendCmd('Preved '+ msg,201);
     idTCP.IOHandler.Capture(memo1.Lines);

     idTCP.SendCmd('Quit', 202);
     result:=true;
   finally
     idTCP.Disconnect;
   end;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if not TCP_Connect('mycommand') then
   ShowMessage('Bad connection!');
end;


Сервер:

procedure TfrmMain.btnConnectClick(Sender: TObject);
begin
 tcpServer.DefaultPort:=StrToInt(edtPort.Text);
 tcpServer.Active:=True;
end;

procedure TfrmMain.tcpServerConnect(AContext: TIdContext);
begin
 AContext.Connection.IOHandler.WriteLn('200 My Server ready.');
end;

procedure TfrmMain.tcpServerExecute(AContext: TIdContext);
var
 LCmd: string;
 LLine: string;
begin
 try
   LLine := AContext.Connection.IOHandler.ReadLn;
   LCmd := Fetch(LLine);

   if AnsiSameText(LCmd, 'QUIT') then begin
     AContext.Connection.IOHandler.WriteLn('202-Bye!');
     AContext.Connection.Disconnect;
   end
   else if AnsiSameText(LCmd, 'PREVED') then begin
     AContext.Connection.IOHandler.WriteLn('Medved.');
     Memo1.Lines.Insert(0,LLine);
   end
   else begin
     AContext.Connection.IOHandler.WriteLn('400 Unknown Command');
   end;
 finally

 end;
end;


В настоящее время существует две проблемы:
- Клиент подвисает при работе с сетью. Антифриз стоит.
- Функция подключения в клиенте не может отловить отсутствие подключения


Сергей М.   (2008-02-07 08:51:00) [1]


> Выдать значение функции в Fаlse;


Так ведь в этом методе у тебя осуществляется не только попытка подключения, но и информационного обмена !


> хоть except ставь, все равно ошибка вылетать будет, но никак
> не перехват исключения


Сказки только не надо нам рассказывать)

Показывай вариант с except'ом


Slym   (2008-02-07 05:44:00) [2]

Использовано Indy9 поютому имена чуть другие...
procedure TfrmMain.tcpServerExecute(AThread: TIdPeerThread);
var
 LCmd: string;
 LLine: string;
begin
 try
   LLine := AThread.Connection.ReadLn;
   LCmd := Fetch(LLine);

   if AnsiSameText(LCmd, 'QUIT') then begin
     AThread.Connection.WriteLn('202  Bye!');
     AThread.Connection.Disconnect;
   end
   else if AnsiSameText(LCmd, 'PREVED') then begin
     AThread.Connection.WriteLn('201  Medved.');//<<<< Добавлено 201 (responce code)
     AThread.Connection.WriteLn('Ya Medved.');
     AThread.Connection.WriteLn('.');//<<<< висяк изза этого idTCP.Capture ждет строку из одной точки
     Memo1.Lines.Insert(0,LLine);
   end
   else begin
     AThread.Connection.WriteLn('400  Unknown Command');
   end;
 finally

 end;
end;


Scapman   (2008-02-06 17:35:00) [3]

>>Что, прямо так и говорит - "висю" ?)
Висим по всем законам Indy

>>Что за функция ?
>>В приведенном тобой коде нет никаких функций - там сплошные процедурные >>методы.
function TForm1.TCP_Connect(msg: string): boolean;

>>И что вообще по-твоему значит "отловить отсутствие подключения" ?
Выдать значение функции в Fаlse;

Дело в том, что код -- сильно почищенный книжковский, а вот что лишнее стер не понимаю.

А так там хоть except ставь, все равно ошибка вылетать будет, но никак не перехват исключения.

(мои наваяния: http://urvin.ifolder.ru/5247244)


Urvin   (2008-02-06 17:35:00) [4]

мой ответ ушел под чужим ником


Сергей М.   (2008-02-06 17:26:00) [5]


> Путем недолгих рассуждений понял, что мне будет очень комфортно
> работать с Indy


Недолгие рассуждения ведут к долгому геморрою.
Это так, к слову.


> Клиент подвисает


Что, прямо так и говорит - "висю" ?)

Или все-таки отладчиктебе дает конкретную инф-цию о конкретной строчке, где у тебя что-то там "подвисает" ?


> Функция подключения в клиенте


Что за функция ?
В приведенном тобой коде нет никаких функций - там сплошные процедурные методы.

И что вообще по-твоему значит "отловить отсутствие подключения" ?

Комментирую то что ты написал:

>  try
>    idTCP.Connect; //попытка подключения
>   finally
>    try
>      idTCP.GetResponse(200); //а нам похрену, успешная она была или неуспешная - мы сразу же запрашиваем у сервера код приветствия)


Наверх

Титульная страница Поиск, карта сайта Написать письмо