Конференция "Сети" » Исправить простейшую программу на Indy, [Indy 10,CodeGear]
 
  • Urvin (06.02.08 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;



    В настоящее время существует две проблемы:
    - Клиент подвисает при работе с сетью. Антифриз стоит.
    - Функция подключения в клиенте не может отловить отсутствие подключения
  • Сергей М. © (06.02.08 17:26) [1]

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


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


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


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

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


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


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

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

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

    >  try
    >    idTCP.Connect; //попытка подключения
    >  finally
    >    try
    >      idTCP.GetResponse(200); //а нам похрену, успешная она была или неуспешная - мы сразу же запрашиваем у сервера код приветствия)
  • Scapman (06.02.08 17:35) [2]
    >>Что, прямо так и говорит - "висю" ?)
    Висим по всем законам Indy

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

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

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

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

    (мои наваяния: http://urvin.ifolder.ru/5247244)
  • Urvin (06.02.08 17:35) [3]
    мой ответ ушел под чужим ником
  • Slym © (07.02.08 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;

  • Сергей М. © (07.02.08 08:51) [5]

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


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


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


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

    Показывай вариант с except'ом
 
Конференция "Сети" » Исправить простейшую программу на Indy, [Indy 10,CodeGear]
Есть новые Нет новых   [134431   +14][b:0][p:0.002]