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

Вниз

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

 
Urvin   (2008-02-06 17:17) [0]

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

Путем недолгих рассуждений понял, что мне будет очень комфортно работать с 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-06 17:26) [1]


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


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


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


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

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


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


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

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

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

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


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

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

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

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

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

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

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


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

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


 
Slym ©   (2008-02-07 05:44) [4]

Использовано 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;


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


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


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


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


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

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



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

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

Наверх




Память: 0.48 MB
Время: 0.016 c
15-1234954507
desc
2009-02-18 13:55
2009.04.19
Существуют ли правила, ГОСТы, стандарты ит.д.


2-1235949145
WeX
2009-03-02 02:12
2009.04.19
Помогите с TTreeView


15-1234696527
Юрий
2009-02-15 14:15
2009.04.19
Портрет пользователей delphimaster.ru


4-1208185369
тимохов
2008-04-14 19:02
2009.04.19
Как получить унифицированное имя файла?


15-1235032497
Kostafey
2009-02-19 11:34
2009.04.19
Стратегия пустых полей