C#でRRQMSocketを使用したTCP通信の実現

C#でRRQMSocketを使用したTCP通信の実現

RRQMのカプセル化により、高接続、高並行処理、データ処理などの一連の基本機能をパッケージ化し、ユーザーが基盤アーキテクチャの構築を気にせず、ビジネスに専念できるようにします。

最終更新 2022/05/26 21:11
黑哥聊dotNet
読了目安 2 分
カテゴリ
.NET
タグ
.NET C# アーキテクチャ設計 RRQMSocket TCP

紹介

  • TCPコンポーネントは、TCPプロトコルに基づく最も基本的なコンポーネントであり、その基本機能はSocketと同じですが、RRQMでラップすることで、高接続、高同時実行、データ処理などの一連の基本機能をパッケージ化し、利用者は基盤構造の構築を気にせず、ビジネスに専念できます。
  • 理論上、TCPコンポーネントは、HTTP、FTP、WebSocket、Telnet、PLC通信、上位機通信など、TCPプロトコルに基づくあらゆる製品に使用できます。

製品の特徴

  • シンプルで使いやすい。
  • マルチスレッド。
  • メモリプール
  • 高性能(サーバーは毎秒200万件のメッセージ、受信データ流量は2.5GB/sに達する)
  • 複数のデータ受信モード(IOCP、BIO、Select)。
  • 複数アドレス監視(複数のIPおよびポートを一度に監視可能)
  • アダプタによる前処理、分割/結合パケット、オブジェクト解析(HTTP、Jsonなど)をワンクリックで解決。
  • 超簡単な同期送信、非同期送信、受信などの操作。
  • イベント駆動型で、すべての操作を把握可能。

製品のアプリケーションシナリオ

  • TCP基本使用シナリオ:クロスプラットフォーム、クロス言語で使用可能。
  • カスタムプロトコル解析シナリオ:任意のデータ形式のTCPデータパケットを解析可能。

以下に私たちのシステムをデモします:

TcpServiceの作成

TcpServiceはTCP系サーバーの基本クラスですが、実際のデータのやり取りには関与しません。実際のデータのやり取りはSocketClientが行います。そのため、TcpServiceの機能は、設定、有効化、管理、終了、SocketClientクラスインスタンスの再構築のみです。そのため、TcpServiceでは、そのSocketClient派生のジェネリックタイプを指定し、さらにHandleReceivedDataメソッドを実装する必要があります。このメソッドは、受信したデータまたはアダプタで変換されたオブジェクトの処理方法を指示します。

したがって、具体的な作成手順は以下の通りです。

TcpService service = new TcpService();
service.Connecting += (client, e) =>{};//クライアントが接続中
service.Connected += (client, e) =>{};//クライアントが接続完了
service.Disconnected += (client, e) =>{};//クライアントが切断
service.Received += (client, byteBlock ,requestInfo) =>
{
    //クライアントからメッセージを受信
    string mes = Encoding.UTF8.GetString(byteBlock.Buffer, 0, byteBlock.Len);
    Console.WriteLine($"已从{client.Name}接收到信息:{mes}");//NameはIP+Port
};
//設定を宣言
var config = new TcpServiceConfig();
config.ListenIPHosts = new IPHost[] { new IPHost("127.0.0.1:7789"), new IPHost(7790) };//2つのアドレスを同時に監視
//設定をロード
service.Setup(config);
service.Start();

TcpClientの作成

TcpClientはTCPクライアントの基本クラスで、抽象クラスであり、インスタンスを作成できません。HandleReceivedDataメソッドを継承して実装する必要があります。このメソッドは受信データの処理方法を指示します。

SimpleTcpClient tcpClient = new SimpleTcpClient();
tcpClient.Connected += (client, e) =>{};//サーバーへの接続成功
tcpClient.Disconnected += (client, e) =>{};//サーバーから切断、接続が成功しなかった場合はトリガーされません。
tcpClient.Received += (client, byteBlock ,requestInfo) =>
{
    //サーバーからメッセージを受信
    string mes = Encoding.UTF8.GetString(byteBlock.Buffer, 0, byteBlock.Len);
    Console.WriteLine($"接收到信息:{mes}");
};
//設定をロード
tcpClient.Setup("127.0.0.1:7789");
tcpClient.Connect();
tcpClient.Send(Encoding.UTF8.GetBytes("RRQM"));

クライアントとサーバーの送信は、いずれもsendメソッドをラップしており、TcpClientとTcpServiceには複数の送信メソッドが組み込まれているため、直接呼び出して送信できます。送信に失敗した場合は、即座に例外がスローされます。

service.Send(“”);

最後に、私の記事を気に入っていただけましたら、フォローをお願いします。.NETエコシステムがますます良くなることを願っています!

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2026/04/22

各OSバージョンの.NETサポート状況(250707更新)

仮想マシンとテストマシンを使用して、各OSバージョンの.NETサポート状況を確認します。OSインストール後、対応するランタイムをインストールし、Stardustエージェントを実行できることを確認します(合格条件)。

続きを読む
同じカテゴリ / 同じタグ 2026/02/07

AOTの使用経験のまとめ

プロジェクト作成当初から、新機能を追加したり新しい構文を使用したりした場合には、すぐにAOT公開テストを実施するという良い習慣を身につけるべきです。

続きを読む