delphi.gif (306 バイト) TCPの使い方


コンポーネントパレットのInternetタブにあるTCPコンポーネントを使うと2台のコンピュータの間で、TCP/IPによる通信が簡単にできます。当然、2台のコンピュータはネットワークでつながれており、TCP/IPが正しくインストールされている必要があります。
Delphi4ではTCPコンポーネントはなくなりました。MSGコンポーネントなどを使ってください。

 

toach.gif (917 バイト) TCPを使うときの一般的クライアント側手順

  1. RemoteHost、RemotePort、LocalPortを正しく設定します。RemoteHostは相手のコンピュータのIPアドレスです。RemotePortとLocalPortは整数で適当な番号(ただし予約ずみの番号があるので使われていないところ。,1001,1002など)
  2. 相手のコンピュータ(サーバ)でも同じように設定します。ただし、RemotePortとLocalPortの番号は入れ替わります。
  3. パラメータ無しでConnectメソッド(下記の例を参照)を実行します。するとOnConnectイベントが発生します。エラーがあるとOnErrorイベントが発生します。
  4. Sendメソッドでデータを送ります。
  5. すべてのデータを送ったらCloseメソッドを実行します。

delphi1.gif (322 バイト)

procedure TfrmPeerA.TCP1Connect(Sender: TObject);
begin
    lblConnect.Caption := 'Connected';
end;

procedure TfrmPeerA.TCP1Error(Sender: TObject; Number: Smallint;
  var Description: WideString; Scode: Integer; const Source,
  HelpFile: WideString; HelpContext: Integer; var CancelDisplay: WordBool);
begin
    lblConnect.Caption := 'Connect Error';
end;

procedure TfrmPeerA.cmdSendClick(Sender: TObject);
begin
    TCP1.SendData(txtSend.Text);
end;


procedure TfrmPeerA.cmdDisconnectClick(Sender: TObject);
begin
    TCP1.Close;
    lblConnect.Caption := 'Disconnect';
end;


procedure TfrmPeerA.cmdConnectClick(Sender: TObject);
begin
try
    with TCP1 do
    begin
        TCP1.Close;
        RemoteHost := txtRemoteHost.Text;
        RemotePort := StrToInt(txtRemotePort.Text);
        LocalPort := StrToInt(txtLocalPort.Text);
        txtLocalHost.Text := LocalIP;
        Connect(NoParam, NoParam)
    end;
except
    on EOleException do MessageDlg('Exception', mtError, [mbOK], 0)
end;
end;

procedure TfrmPeerA.FormCreate(Sender: TObject);
begin
    with TCP1 do
    begin
        RemoteHost := txtRemoteHost.Text;
        RemotePort := StrToInt(txtRemotePort.Text);
        LocalPort := StrToInt(txtLocalPort.Text);
    end;
end;

function TfrmPeerA.NoParam: Variant;
begin
  TVarData(Result).VType := varError;
  TVarData(Result).VError:= DISP_E_PARAMNOTFOUND;
end;

 

toach.gif (917 バイト) TCPを使うときの一般的サーバ側手順

  1. RemoteHost、RemotePort、LocalPortを正しく設定します。
  2. Listenメソッドを実行してコネクトを待ちます。
  3. クライアントがConnectメソッドを実行するとOnConnectRequestイベントが発生します。コネクトに失敗するとOnErrorイベントが発生します。成功するとOnConnectイベントが発生します。
  4. もし、コネクションが閉じていなければ一度閉じて(Closeメソッド)、接続要求を受け入れます(Acceptメソッド)。
  5. クライアントがSendメソッドを実行すると、OnDataArrivalイベントが発生します。GetDataメソッドを実行してデータを受け取ります。エラーが発生するとOnErrorが発生します。

delphi1.gif (322 バイト)

procedure TfrmPeerB.cmdSetClick(Sender: TObject);
begin
    with TCP2 do
    begin
        RemoteHost := txtRemoteHost.Text;
        RemotePort := StrToInt(txtRemotePort.Text);
        LocalPort := StrToInt(txtLocalPort.Text);
        txtLocalHost.Text := LocalIP;
        Listen;
    end;
end;


procedure TfrmPeerB.TCP2ConnectionRequest(Sender: TObject;
  requestID: Integer);
begin
    if TCP2.State <> sckClosed then
        TCP2.Close;
    TCP2.Accept(requestID);
    lblConnect.Caption := 'Connected';
end;

procedure TfrmPeerB.TCP2DataArrival(Sender: TObject; bytesTotal: Integer);
var
    rcvData: OleVariant;
begin
    TCP2.GetData(rcvData, varOlestr, 80);
    txtListen.Text := rcvData;
end;