2010-12-14 3 views
2

私はTCPのマルチスレッドを理解しようとしているので、基本的なtelnetテキスト "router"をコーディングしています。TCPを待っているスレッドに命令を送信しますか?

ReadLine()を使用すると、TCPリスナーを使用する各スレッドは、テルネットクライアントからの入力を待機し、送信されたテキストに基づいて応答します。私はこれを複数のスレッドと複数のtelnetクライアントで動作させています。

すべてのスレッドにメッセージを条件付きで送信します。 たとえば、いずれかのスレッドから送信されたテキストが "Alert!"接続されたクライアントのすべてのスレッドを実行するようにしますWriteLine("Alert!")

これは意味がありますか? 私の問題は、あるスレッドが別のスレッドでイベントを発生させる方法を知らないことです。

答えて

1

イベントブローカーのパターンを調べる必要があります。基本的には、すべてのスレッドが購読するイベントを持つオブジェクトが1つあります。また、イベントを呼び出すメソッドを呼び出すこともできます。複雑かもしれませんが、かなりシンプルです。

例コードはhttp://msforge.net/blogs/paki/archive/2007/11/20/EventBroker-implementation-in-C_2300_-full-source-code.aspxです。

+0

はい、これは素晴らしいスタートです。ありがとうございます!今度は、各スレッドのためにwritelineを実行する次の問題があります... – Matthew

+1

は、イベントを購読しているイベントハンドラ内で実行するのに十分なはずです。 –

+0

ポインタはありますか?問題は、telnetセッションが基本的に 'readline'の周りに座っていることです。私はこの同じソケットで' eventeline 'から 'writeline'をどうやって実行しますか?静的なソケットを作成する必要があるかもしれないと思っていますか? – Matthew

0

スレッドをデータと見なさないでください。それらを構造物と考えてください。

明らかに、クラスAがクラスBでイベントを発生させるには、BはAを参照してそのイベントに登録する必要があります。

しかし正直なところ、間違った方向に向かっていると思います。 1つのTCPリスナを持つ。メッセージが入ったら、Webリクエストオブジェクトを取得し、独自のスレッドで処理できます。スレッドを処理するときに、単語 "Alert"が見つかった場合は、上位レベルのクラスにイベントを生成します。その後、イベントを処理し、何が必要なのかを行います。アーキテクチャ例:

Managerは、TcpHandlerをインスタンス化し、そのAlertReceivedイベントにサブスクライブします。 TcpHandlerはMessageProcessorをインスタンス化し、そのMessageReceivedイベントをサブスクライブします。

TcpHandlerがTcpListenerオブジェクトから何かを読み取るとき、MessageProcessorクラスを起動し、別のスレッドの実際のデータを読み取らせます。

MessageReceivedイベントを発生させます。その後、TcpHandlerクラスでイベントを処理します。受信したデータが「アラート」の場合は、AlertReceivedイベントを発生させます。

マネージャークラスは、イベントをキャッチし、あなたが望むものを何でも実行します。

+0

telnetセッションを実行している場合は、接続を開いたままにして、各クライアントとの通話をそれぞれのスレッドで行う必要があります。 n個のクライアントは、クライアントからの入力を待機する各自のリスナにn個のスレッドを割り当てます。 –

+0

@Pauli良い点、しばらくの間はtelnetを使用していない。 – AngryHacker

関連する問題