•  

ГлавнаяIndyЧастые вопросы по Indy → TIdTCPServer Запускаю и.. ничего не происходит!

Создано: 17.05.2014 1:17:29 · Исправлено: 17.05.2014 1:17:29 · Прочтений: 1674

Здравствуйте. Я новичок. Проблема самому кажется идиотской, однако она есть. CodeGear Delphi, Indy 10.1.5 На форму кидаю компонент IdTCPServer1: TIdTCPServer
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, StdCtrls,
  Dialogs, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, IdContext (дописывал вручную, сама не появилась);

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure IdTCPServer1Connect(AContext: TIdContext);
    procedure IdTCPServer1Execute(AContext: TIdContext);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  IdTcpServer1.Active:=True;
end;

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
  ShowMessage(connected!);
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
//
end;

End.
Запускаю и.. ничего не происходит! Нет включения сервера. Менял порты, биндинги. Делал сервер по умолчанию активным, принудительно его кнопками включал-выключал. Ничего. Как-будто компонента не существует. Помогите, пожалуйста.
А вы посмотрите демки Indy, там много примеров.
Ткните носом, пожалуйста, что качать и что смотреть? Залез сюда: http://www.indyproject.org/ Там довольно долго ходил по ссылкам, в итоге остановился на раделе Indy.Sockets (VCL) В этом разделе во вкладке Sources накачал файлов себе и просто обалдел от количества замечательных исходников библиотек. Пожалуйста, дайте ссылку на файлик с примерами Дельфи.
Гугл - 2 минуты. http://www.delphi.pnz.ru/components.php вторая ссылка снизу.
1)Кусок кода у вас какой-то неправильный, должно быть примерно так: ....
type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    procedure FormCreate(Sender: TObject);
.... 2)DefaultPort поставили в свойствах? например 7777 3)Как вы определяете что сервер запущен? Как минимум он должен слушать порт. Запустите свою прогу. В командной строке запустите netstat -a -n >>qq в файле qq должны быть строка ... TCP 0.0.0.0:7777 0.0.0.0:0 LISTENING ... 4)А теперь соединитесь к своему серверу telnet localhost 7777 Вот тут-то и выскочит сообщение Connected!
Демки INDY: http://www.indyproject.org/Sockets/Demos/index.EN.aspx Спасибо всем ответившим!
А проблемы, по моему и не было.
procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
  ShowMessage(connected!);
end;
Connect - это когда кто-то подключился. А то, что автор написал IdTcpServer1.Active:=True; так это только сервер начал слушать на порту, а пока кто-то не подключится, то никакого коннекта и нет.
IOHandlera не было, как я понял. В примере Инди сервер-клиент используется компонент IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL для передачи с SSL шифрованием. Вкратце получается так: Сервер:
...
appDir:= extractFilePath(application.exename);
IdServerIOHandlerSSLOpenSSL.SSLOptions.KeyFile:= appDir + \SSL\asokuz.key;
IdServerIOHandlerSSLOpenSSL.SSLOptions.CertFile:= appDir + \SSL\asokuz.crt;
IdServerIOHandlerSSLOpenSSL.SSLOptions.RootCertFile:= appDir + \SSL\asokuz.pem;

IdTCPServer.Active:=true;
...

procedure TForm1.IdServerIOHandlerSSLOpenSSLGetPassword(var Password: String);
begin
  password:= password;
end;

procedure TForm1.IdTCPServerConnect(AContext: TIdContext);
begin
  if (AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase) then
    TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough:= false;
end;

procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
var
  line: string;
begin
  line:= AContext.Connection.IOHandler.ReadLn;

  if (line=HI!) then begin
    try AContext.Connection.IOHandler.WriteLn(Сам ты Хай!)
    except ShowMessage(Ошибка передачи данных!);
    end;
  end
  else AContext.Connection.IOHandler.WriteLn(Я не понял твоей команды!)
end;
Клиент:
procedure TForm1.Button1Click(Sender: TObject);
var line: string;
begin
    IdTCPClient.Host:= edtHostAddr.text;
    IdTCPClient.Connect;
    IdTCPClient.IOHandler.WriteLn(HI!);
    line:=IdTCPClient.IOHandler.ReadLn;
    ShowMessage(line);
    IdTCPClient.Disconnect;
end;
простите, если напутал с синтаксисом, пишу по памяти..