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

Вниз

Исправить простейшую программу на 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.039 c
2-1235812626
Strate
2009-02-28 12:17
2009.04.19
Интересное поведение компонента TTrayIcon (D2009)


1-1211146906
Shadow
2008-05-19 01:41
2009.04.19
зайди там все объяснено!


2-1236005389
faiwer
2009-03-02 17:49
2009.04.19
Как убить нить?


3-1219473823
123123
2008-08-23 10:43
2009.04.19
проблема с FireBird


15-1235102906
freeee
2009-02-20 07:08
2009.04.19
посоветуйте литературу





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский