2009-11-15 15 views
6

私はすでに回答を検索しましたが、類似のものは見つかりませんでした...Cでソケットリスナーを実装する最善の方法

私はかなりC#を新しくしています。私はWinFormsを使用してC#でプログラムを作成する必要があります。それは基本的に2つのコンポーネントを持っています:UIと私はソケットTCPポートで恒久的にリッスンするプロセスを持つ必要があります。受信したものがあれば、イベントなどを作成してUIを更新する必要があります。

質問:プログラムの実行中に常に聴く必要があるプロセスを実装する最も良い方法は何ですか?

メッセージを受け取ったら、UIに更新する必要があることをどのように通知できますか?

ありがとうございます!

答えて

1

TcpListenerクラスを使用できます。ドキュメントには例があります。

+0

私は彼らが建築的な答えを探していると信じています... TcpListenerをイベント駆動型プログラムと統合する方法がわからないようです。 – Polaris878

1

起動時に、新しいスレッドを無限ループでリッスンする新しいスレッドを生成(作成)することができます。メッセージが受信されると、スレッドは共有リソースを更新できます(フラグを設定します)。もちろん、メッセージを転送するために同期キューを使用した場合、これをより洗練されたものにすることができます。またはWCFを介して(これはあなたの目的のために過酷に思えますが)。

1

プログラムが起動するときは、新しいスレッドであなたのTCPリスナーのコードを起動することができこれは、これを行うための最善の方法ではないかもしれないが、それは動作するはずです...

は...あなたはTCPを持っている。この方法UIがオフになっている間にコードを聞いて、他のものをやっている。 TCPスレッドで何かが発生すると、何らかの種類のイベントまたはイベントキューによってUIスレッドに通知する必要があります。

何かが受け取られたときにWinFormsオブジェクトを更新するという点で、私はWinFormsコントロールを作成したスレッドのみがコントロールを更新できると信じています。だから、あなたもそれを考慮する必要があります。

これは私が以前に取り組んでいた問題です。私の現在のプロジェクトでは、私が上で述べたことをしています...しかし、それを動作させるためにかなりのスレッド同期があります。

+2

UIを更新するデリゲートを渡してControl.Invokeメソッドを使用するだけで、別のスレッドからUIを簡単に更新できます。 –

8

TcpListenerを使用すると、別のスレッドで着信接続を待つことができます。新しい接続を受け取るたびに、新しいスレッドを作成して処理します。 Control.Invokeを使用して、UIを非UIスレッドから更新します。ここに短い例があります:

public MainForm() 
{ 
    InitializeComponents(); 
    StartListener(); 
} 

private TcpListener _listener; 
private Thread _listenerThread; 

private void StartListener() 
{ 
    _listenerThread = new Thread(RunListener); 
    _listenerThread.Start(); 
} 

private void RunListener() 
{ 
    _listener = new TcpListener(IPAddress.Any, 8080); 
    _listener.Start(); 
    while(true) 
    { 
     TcpClient client = _listener.AcceptTcpClient(); 
     this.Invoke(
      new Action(
       () => 
       { 
        textBoxLog.Text += string.Format("\nNew connection from {0}", client.Client.RemoteEndPoint); 
       } 
      ));; 
     ThreadPool.QueueUserWorkItem(ProcessClient, client); 
    } 
} 

private void ProcessClient(object state) 
{ 
    TcpClient client = state as TcpClient; 
    // Do something with client 
    // ... 
} 
+0

なぜ私はdownvotedですか?コメントしてください !私は批判には手をつけていますが、私の答えが間違っているかどうか分からなければ、それはあまり建設的ではありません。 –

+0

これは化粧品ですが、この後にセミコロンが1つ多くあると思います。 ;; (明らかにするために、あなたが少なくとも私によってではなく、あなたが落選した理由ではありません) – Manu

関連する問題