0

私は現在、C# で記述された TCP マルチスレッド サーバーとクライアントに取り組んでいます。私は Google を調べていて、5 つ以上の例を試しましたが、すべての要件を満たすものはないようです。私はネットワーキングに詳しくないので、誰かが私を正しい方向に向けることができれば幸いです.

必要な要件は次のとおりです。

  1. マルチスレッド、複数のクライアントを処理できるサーバーが必要ですが、それらのクライアントは相互に通信する必要はありません。
  2. クライアントがサーバーに接続した後、サーバーがすべてのクライアントを削除するまで、クライアントは相互にメッセージを送信し続ける必要があります。サーバーは各クライアントを識別する必要があります。通常、クライアントは自分自身でサーバーから切断する必要はありません。
  3. 切断通知、Google で見つかったこれらの例のほとんどにはこの機能がありません。サーバーがユーザーに通知できるように、接続されたクライアントがいつ切断されるかをサーバーに知らせる必要があります。

実際に私が見つけた最も近い例はこれです: http://www.codeproject.com/Articles/22918/How-To-Use-the-SocketAsyncEventArgs-Class

しかし、私が直面している問題は、メッセージがクラス Token 内にあることです。これらのクラスをすべて、メイン アプリケーションである Window Form Application に含めました。クライアント ID、クライアント ステータス、またはクライアントへのアクションなどの情報は、フォームで実行されます。これらの変数を Token クラスからフォームに取り込む方法がわかりません。

これは私の目的に合うと思われる別の例です: http://www.codeproject.com/Articles/2866/Multi-threaded-NET-TCP-Server-Examples

しかし、フォームが表示されなくなったため、変更方法がわかりません。

手伝ってくれてありがとう。

4

1 に答える 1

1

数か月後... まず、ウィンドウ フォームは非同期ネイティブではないことに注意する必要があります。tcp AsyncCallback を使用するには、invoke メソッドを実装する必要があります。クライアントを処理する他の場所では、次のような新しい辞書を作成する必要があります。

Dictionary<string, System.Net.Sockets> clientList; 

データベース ID の場合は int にすることも、単にネイティブ システム ハンドルを使用することもできます。

this.anonymousSock.Client.Handle

そして、次のように追加します:

clientList.Add("ID", this.anonymousSock);

最後に:

public void Send(string data, string id)
    {
        Socket Client = this.clientList[id];
        byte[] byteData = Encoding.ASCII.GetBytes(data);
        Client.BeginSend(byteData, 0, 
            byteData.Length, 0, 
            new AsyncCallback(SendCallback), Client);
    }

この場合、受信中にソケット エントリを確認するか、トークンを使用してクライアントを識別できます。

そして、スレッドでCPU /メモリが燃えることはありません。

于 2013-07-25T07:54:49.470 に答える