3

Indy10 TCP/IP アプリケーションを変更しています。次のことを行うクライアント側機能の実装に関する提案/意見/サンプル コードをお願いします。

a) アプリケーションの起動時にスプラッシュ スクリーンが表示され、クライアント コンピューターがインターネットにアクセスできること、および TCP サーバーが起動して実行中であり、通信を待機していることを確認します。そうでない場合は、アプリケーションを終了する必要があります。

b) クライアントとサーバー間のデータ交換の前に上記の (a) を実行する

さらに、サーバーは、稼働中であることを潜在的なクライアントに通知するために、ある種のメッセージを繰り返しブロードキャストする必要がありますか?

ご協力ありがとうございます。

4

2 に答える 2

2

TCP サーバーに接続できるかどうかを確認する方法は?

最初の質問に。スプラッシュ画面が表示されたときに実行する別のスレッドへの接続試行を確実にラップします。Connectそのスレッドでは、例外をキャッチしようとするだけです。例外が発生した場合、接続は失敗しました。そうでない場合は、接続できました。この状態に関する通知には、カスタム メッセージを使用します。このメッセージは、次の擬似コードに示すようなスプラッシュ スクリーン フォームに送信されます。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdTCPClient;

const
  WM_CONNECTION_NOTIFY = WM_USER + 1;
  SC_CONNECTION_FAILURE = 0;
  SC_CONNECTION_SUCCESS = 1;

type
  TConnThread = class(TThread)
  private
    FMsgHandler: HWND;
    FTCPClient: TIdTCPClient;
  protected
    procedure Execute; override;
  public
    constructor Create(const AHost: string; APort: Word; ATimeout: Integer;
      AMsgHandler: HWND); reintroduce;
    destructor Destroy; override;
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FConnThread: TConnThread;
    procedure WMConnectionNotify(var AMessage: TMessage); message WM_CONNECTION_NOTIFY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TConnThread }

constructor TConnThread.Create(const AHost: string; APort: Word;
  ATimeout: Integer; AMsgHandler: HWND);
begin
  inherited Create(False);
  FreeOnTerminate := False;
  FMsgHandler := AMsgHandler;
  FTCPClient := TIdTCPClient.Create(nil);
  FTCPClient.Host := AHost;
  FTCPClient.Port := APort;
  FTCPClient.ConnectTimeout := ATimeout;
end;

destructor TConnThread.Destroy;
begin
  FTCPClient.Free;
  inherited;
end;

procedure TConnThread.Execute;
begin
  try
    FTCPClient.Connect;
    PostMessage(FMsgHandler, WM_CONNECTION_NOTIFY, 0, SC_CONNECTION_SUCCESS);
  except
    PostMessage(FMsgHandler, WM_CONNECTION_NOTIFY, 0, SC_CONNECTION_FAILURE);
  end;
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  FConnThread := TConnThread.Create('123.4.5.6', 123, 5000, Handle);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FConnThread.Free;
end;

procedure TForm1.WMConnectionNotify(var AMessage: TMessage);
begin
  case AMessage.LParam of
    // the connection failed
    SC_CONNECTION_FAILURE: ;
    // the connection succeeded
    SC_CONNECTION_SUCCESS: ;
  end;
end;

end.

サーバーは、実行中の潜在的なクライアントに通知するために、ある種のメッセージを繰り返しブロードキャストする必要がありますか?

いいえ、これは別の方向に機能します。クライアントは、サーバーが実行されているかどうかをサーバーに尋ねます。サーバーはクライアントを知らないが、クライアントはサーバーを知っているからです。

于 2012-09-13T11:32:59.663 に答える
2

「サーバーはある種のメッセージを繰り返しブロードキャストする必要がありますか」について:

IP マルチキャストを積極的に使用して、関心のあるクライアントにロケーション(IP アドレス、ポート番号) や追加情報 (ステータスなど) をアドバタイズするシステム (サーバー、サービス) があります。

Internet Direct (Indy) UDP コンポーネントを使用して、サーバー側とクライアント側の両方を簡単に実装できます。

以下は、完全なソース コードを含むオープン ソース メッセージ ブローカー Apache ActiveMQ の Delphi の IP マルチキャストの例です。

Delphi XE4 および Indy 10.6 で ActiveMQ ブローカーを発見する

于 2012-09-13T14:25:17.687 に答える