Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Indy 10 TCP client -server пример работы


Автор: wagner 18.5.2005, 09:29
Добрый день граждане !

Кто нибуть может объяснить как сделать простой клиент сервер с
помощью компонентов Indy 10.

Стандартный хелп не подходит (там описывается Athread, а в 10 Iindy метод заменили на Acontext)

Хочется понять как с этим работать вообще ... то есть если можно пример по подробнее smile
Для начала из разряда установки соединения и передачи приветствия от клиента к серверу,
а потом вариант с передачей данных (наприме числового массива)

C Уважением Wagner

Автор: RA 19.5.2005, 00:51
...\Delphi7\Demos\Indy\BasicClientServer

Автор: wagner 19.5.2005, 07:47
Текст единственного файла в данном каталоге:
Цитата

Delphi 7
Indy V9 Demos

===========================

Indy V9 Demos

Demo applications for Indy V9 are available from the
downloads section on the Indy site at:

http://www.nevrona.com/indy

As new demos are constantly being built and tested,
this is the most up to date location for demo
downloads.

If you have any problems with demos please join the
"Indy Demos" group at yahoo groups, and report them
there:

http://groups.yahoo.com/group/Indy-Demos/


На сайте перерыл все - ничего нет smile(
Если есть возможность приведите исходник из примера - буду очень признателен,
кое чего я и сам накопал ..но как-то криво это работает - серверу я комманду посылаю от сервера ответа нет (( :

сервер
Код

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  cmd_line : string;
begin
   with AContext.Connection.IOHandler do
   try
    begin
      cmd_line :=ReadLn;
      ListBox1.Items.Add(cmd_line);
      if cmd_line='-clr' then ListBox1.Clear;
      if cmd_line='-h' then
        Begin

          WriteLn('Some help here');
        End;
    end;
   finally
   Close;
   end;

end;

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
  with AContext.Connection.IOHandler do
  begin
   WriteLn('Hello from server.');
  end;
end;


клиент
Код

begin
with idTCPClient1 do
  try
   Connect;
   ListBox1.Items.Add(IOHandler.ReadLn);
  except
   ListBox1.Items.Add('Connection error');
  end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
   with idTCPClient1.IOHandler do
  begin
   try
    Open;
    WriteLn(Edit1.Text);
   finally
    Close;
   end;
  end;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
  try
   idTCPClient1.Disconnect;
   ListBox1.Items.Add('disconnected from server');
  except
   ListBox1.Items.Add('server not responced');
  end;
end;

Автор: <Spawn> 21.5.2005, 05:31
Так зачем ты обращаешься к IOHandler? Ты его хоть к компоненту прицепил? Для твоего примера достаточно написать:

Код

idTCPClient1.WriteLn('asdf');


И для установленного соединения:

Код

AContext.Connection.WriteLn();


Под рукой нет Indy 10, т.к. не установлена Delphi 2005, но на Indy 9 все работает.

Автор: KEM 23.2.2007, 16:33
Может есть у кого что новое по теме ?

Код

procedure TForm1.Timer1Timer(Sender: TObject);
var
    ftmpStream : TMemoryStream;
begin
 Timer1.Enabled := False;
try
// if not IdTCPClient1.Connected then
//   IdTCPClient1.Connect;
    //if connected then Close;
   // open;
   IdTCPClient1.
   IdTCPClient1.Socket.WriteLn('SRN'); - А ЭТО НА СЕРВЕРЕ НИКАК НЕ ФИКСИРУЕТСЯ
    // delete if exists
    // in production situation you might store binary downloads like this in a cache folder
    ftmpStream := TMemoryStream.Create;
    while IdTCPClient1.Connected do  -- ВОТ ТУТ ВЫЛЕТАЕТ ОШИБКА
     Begin
        IdTCPClient1.Socket.ReadStream(fTmpStream,-1,true);
     End;
    inc(i);
    fTmpStream.SaveToFile(intToStr(i)+'.jpg');
    FreeAndNil(fTmpStream);
    IdTCPClient1.Disconnect;
    Timer1.Enabled := True;
except
on E : Exception do
    ShowMessage(E.Message);
end;

end;

Вообщем так и не вкурил как в инди 10 потоки принимать на клиенте и отправлять на сервере...  smile 

Update:
Оказалось всё просто, в самом начале выше приведённой процедуры надобыло нипмсать
Код

IdTCPClient1.Disconnect;
try
 IdTCPClient1.Connect;
except on E: Exception do
 ShowMessage(E.Message);
End;

Странно но работает...

Автор: Lexicss 21.1.2008, 15:11
Цитата(<Spawn> @  21.5.2005,  05:31 Найти цитируемый пост)
Так зачем ты обращаешься к IOHandler? Ты его хоть к компоненту прицепил? Для твоего примера достаточно написать:

код Pascal/Delphi
1:

idTCPClient1.WriteLn('asdf');


В Indy10 так нельзя. Метод WriteLn имеется только через IdTCPClient1.Connection.IOHandler
или (только на клиенте) IdTCPClient1.Socket

Автор: Snowy 22.1.2008, 14:49
http://indy.fulgan.com/ZIP/Indy10demo.zip

Автор: Delphist 1.3.2009, 02:37
Цитата(Snowy @ 22.1.2008,  15:49)
http://indy.fulgan.com/ZIP/Indy10demo.zip

Snowy, как те удалось ее найти? Я вот на это дупло зашел http://www.projectindy.org/Sockets/Demos/index.EN.aspx - не фига нет по сегодняшний день?
У кого-нибудь есть букварь на русском по Indy10, подобие книжке Глубины Indy - правда там рассматривалось для Indy9 

Автор: myk 9.4.2009, 08:35
дайте нам букварь!(=

Автор: davemus 22.5.2009, 18:30
Цитата(myk @  9.4.2009,  08:35 Найти цитируемый пост)
дайте нам букварь!(=


и мне  smile  smile 

Автор: MetalFan 22.5.2009, 20:32
читайте на англицком и смотрите сорцы. там же все просто

Автор: jsj 16.2.2010, 19:56
Ок, а как сделать чтобы порт был любым для подключения?
Ну на сервере - я поставил НОЛЬ, типа он все принимает...

А на клиенте НОЛЬ не пашет - но фиксированно задавать порт - не колонкор - а как сделать цивильно?
А, народ? =)

Автор: Snowy 17.2.2010, 16:08
Цитата(jsj @  16.2.2010,  19:56 Найти цитируемый пост)
а как сделать чтобы порт был любым для подключения?
Никак - это фантастика.
Так не бывает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)