3

サーバー用とクライアント用の 2 つのフォームがあります。サーバー フォームに ttcpserver をドロップし、localhost プロパティを 127.0.0.1 に、localport プロパティを 55555 に、Active プロパティを true に設定した後、button1(sendtextbutton) onclick イベント ハンドラを作成しました。

procedure TForm2.Button1Click(Sender: TObject);
begin
      TcpServer1.Sendln('message');
end;

次に、クライアント フォームに 1 つの ttcpclient 1 ラベル 2 ボタンをドロップし、クライアントのリモート ホスト プロパティを 127.0.0.1 に、リモート ポートを 55555 に設定し、connectbutton(button1) のイベント ハンドラーを作成しました。

procedure TForm2.Button1Click(Sender: TObject);
begin
try
TcpClient1.Active := true;
except
showmessage('error');

end;
end;

ttcpclient の onconnect イベントを書きました:

procedure TForm2.TcpClient1Connect(Sender: TObject);
begin
    Label1.Caption := 'connected!';
end;

最後に、ttcpclient の onrecieve イベント ハドラー:

procedure TForm2.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
begin
    Label1.caption := TcpClient1.Receiveln();
end;

クライアント プログラムのキャプションは、(接続してサーバー フォームのボタンをクリックした後) 'メッセージ' に変更されるはずでしたが、変更されません。私はそれを間違った方法でやっていますか?はいの場合、それを行う方法は?サーバーからクライアントにテキスト メッセージを送信しようとしています (逆接続です!)

4

2 に答える 2

2

TTcpServer は、ブロードキャスト形式のメッセージを困難にする接続接続のリストを保存しません。

TidTcpServer と TidTcpClient に切り替えることをお勧めします。TidTcpServer コンポーネントには Context プロパティがあり、これをループしてクライアントにメッセージをブロードキャストすることができます。

TidTcpServer と TIdTcpClient の使用例へのリンクを次に示します。

于 2010-07-06T16:53:29.017 に答える
1

TTcpServer.SendLn()接続されたソケットのクライアントのエンドポイントにデータを送信しないため、サーバー コードは機能しません。そのため、クライアントはデータをまったく見ることができません。

TTcpServer.BlockModeプロパティがbmThreadBlocking(デフォルトでは) に設定されている場合、またはがTTcpServer.BlockMode他の値に設定されていて、パラメーターなしのオーバーロードされたTTcpServer.Accept()メソッドを手動で呼び出している場合、クライアントのエンドポイントにアクセスできる唯一の場所はTTcpServer.OnAcceptイベント内からです。これらの条件下では、そのイベント ハンドラーが終了すると、サーバーはクライアントを切断するため、サーバーがクライアントに対して行う作業はすべて、そのイベント内から行う必要があります。

それがニーズに合わない場合は、TTcpServer.BlockModeプロパティをbmBlockingまたはに設定し、オブジェクトを返すbmNonBlockingオーバーロードされたメソッドを手動で呼び出す必要があります。イベントがトリガーされて終了すると、そのオブジェクトの所有権を取得し、その有効期間を完全に制御できるようになり、いつでも好きな方法でアクセスできます。TTcpServer.Accept()TCustomIpClientTTcpServer.OnAccept

于 2012-07-13T21:15:25.287 に答える