2

私はC#を初めて使用し、過去にほとんどWebベースのコーディングを行ってきました。単一のクライアントと通信するTCPサーバーを作成しています。プログラムが接続の待機(またはデータの読み取り、送信など)をブロックしたくないので、複数のスレッドが必要であることを知っています。

これまで、GUIとクライアントとの通信用のクラスを備えた簡単なテストアプリケーションを作成しました。メインGUIクラスは、通信クラスのインスタンスを作成します。BackgroundWorkerにsocket.accept呼び出しがあり、接続されたソケットをRunWorkerCompletedEventArgs.Resultの通信クラスに戻そうとしています。これは機能していません。DoWorkメソッドに割り込んで、ソケットが接続されていることを確認できます。次に、DoWorkEventArgs.Resultを接続されたソケットに設定し、それを通信クラスに戻そうとします。RunWorkerCompletedメソッドでは、ソケットは接続されていません。

単一のクライアントにTCPサーバーを実装する方法について間違った考えを持っている可能性があります。私が見たすべての例は複数のクライアント向けに設計されていますが、私は単一のクライアントを扱います。私はクライアントを制御できず、単にクライアントと通信しようとしています。

接続されたソケットをBackgroundWorkerからメインクラスに戻すにはどうすればよいですか、またはコードを構造化するためのより良い方法が必要です。

アップデート:

私はクライアントを管理していません。これは組み込みLinuxデバイスです。プロトコルは非常に単純です。サイズヘッダーとそれに続くデータバイト。

ターゲットは.NET2.0です。WCFは.NET3.0以降でのみ使用できるようです。

アップデート:

私のコードは、クライアントにコマンドを送信し、データを受信します。私のコードは、データを継続的に送受信する必要がある長時間実行されるアプリケーションになります。

4

1 に答える 1

0

他のデザインのアイデアを求められたので、ここに私のプロジェクトで過去4年間の私の提案(Javaと.NETでこのパターンを使用しました)があり、それは非常にうまく機能することが証明されました!)主なアイデアは次のとおりです。メインクラスにソケットバックします。バックグラウンドワーカーは、クライアントを待機しているソケットをブロックする必要があります。接続を取得すると、ループスルーしてクライアントからデータを読み取ります。バックグラウンドワーカーは、受信したパケット(バイナリ形式、メインクラスの責任であるため、ここではデータを解析しないでください)をスレッドセーフキューを介してメインクラスに通信します。メインクラスはループして(またはブロッキングキューを使用して)、クライアントからバックグラウンドワーカーを介して送信される新しいメッセージを処理できます。

このようにして、コードを2つの異なるレイヤーに分割します。クライアントとの会話を担当するワーカーと、クライアントの発言を理解し、オプションで応答することを担当するメインクラス(引き続きワーカーを介して)

編集あなたの編集から、あなたは.NET2.0を使用していることがわかります。このバージョンのフレームワークには、残念ながら、.NET4で導入されたスレッドセーフなブロッキングキューがありません。それでも、.NET2に基づく多くのスレッドセーフキューの実装を見つけることができます

于 2012-07-06T20:06:09.363 に答える