5

私はソケット プログラミングの初心者ですが、単純な tcp サーバー クライアント プログラムを書いていたので、ストリーム ベースの API はあまり使いにくいことがわかりました。

私のプログラムは単純です:

  1. クライアントがサーバーに接続します
  2. サーバーは、予期しない間隔でクライアントにメッセージを継続的に送信します
  3. クライアントはメッセージを受信し、メッセージに含まれるデータに従って作業を行います

ただし、ストリームベースの API を使用するには、次のことを行う必要があります。

  • メッセージの区切り記号/区切り記号を定義する
  • whileループを使用してストリームからデータを読み取る
  • すべてのバイトを連結し、区切り文字を見つけてください
  • デリミタが存在する場合、データを分割し、メッセージを抽出します

それは私のプログラムのロジック全体よりもさらに多くの作業です。そのため、ライブラリが私のために上記のことを実行できるのではないかと考えています。そのようなライブラリを使用して、次のようにプログラムできます。

// Server
TcpListenerEx server = new TcpListenerEx();
TcpClientEx client = server.Accept();
client.SendMessage(new StringMessage("hello world"));

// Client
TcpClientEx client = new TcpClientEx();
client.Connect("localhost", 8989);
while (true) {
    IMessage message = client.ReadMesage();
    // Do work acording to message
}

どんな提案でも大歓迎です、ありがとう。

4

5 に答える 5

3

これに対するもう 1 つのオプションは、メッセージ キュー (TCP/IP ストリームではなく) であり、バイト ストリームではなくメッセージを処理する MSMQ です。MSMQ 自体は、TCP/IP や WCF など、さまざまなトランスポートを使用できます。

Windows のみを扱っている場合 (.NET について言及したので、それは不当な制限ではありません)、Windows 2000 以降のすべてのバージョンで使用できます。

それを使用する基本的な方法と、より高度なもののいくつかを示す優れたサンプルコードがいくつかあります。送信者が基本的にメッセージを作成してキューに入れるのは簡単です。リスナーは完全なメッセージを受け取ります。

これほど簡単なことはありません。Windows でメッセージングを行いたい場合は、それを迅速に行うための最も簡単な方法の 1 つです。

于 2012-09-13T08:51:53.583 に答える
2

バイトストリームに区切り文字を埋め込むことは、見た目ほど簡単ではありません。誤って区切り文字を含むメッセージに対処する必要があります。これにより、多くの厄介な検出およびエスケープ コードが発生します。

メッセージを構成する非常に簡単な方法は、長さの接頭辞を先頭に追加することです。送信側では、メッセージをバッファにシリアル化し、長さを書き込んでからバッファを書き込みます。受信側は、最初に 4 バイトを読み取って長さを取得します。次に、本文を読み取ります。

これは、おそらくすべてのバイナリ プロトコルがわずかに異なるため、.NET には組み込まれていません。

これらはすべて非常に単純であるため、ライブラリを見つけることはまずありません。このようなプロトコルは、数十行で記述できます。私のお勧めは、自分でやることです。

ただし、メッセージを構造化したい場合は、 protobuf-net (.NET 用の Google プロトコル バッファ)という優れたライブラリがあります。メッセージのフレーミングとシリアライゼーションを非常に健全な方法で行います。プロトコルのバージョン管理を適切にサポートします。

于 2012-09-13T08:56:50.797 に答える
0

SignalRオープン ソース フレームワークが役立つと思います。

クイックスタートのサンプルを見て、要件に適合するかどうかを確認してください。

于 2012-09-13T09:07:01.303 に答える
0

Apache Thrift は別のオプションで、WCF に似ていますが、はるかに単純で、特定の .NET Framework にバインドしません。

http://thrift.apache.org/

.NET 2 で問題なく動作し、Mono でも問題なく動作します。

http://thrift.apache.org/docs/install/

于 2012-09-13T09:00:34.677 に答える
-1

最近では、WebSocket の使用を検討する必要があるかもしれません。

名前にもかかわらず、実際にはより一般的なプロトコルです。基本的にメッセージ指向です。メッセージはフレームに分割される場合がありますが、完全なメッセージを受信できるようにこれらのフレームを再構築するライブラリが多数あります。

これらのライブラリにより、プラットフォームに依存せずに WebSocket を使用できます。ノード、.Net、ピュア ブラウザ JavaScript - 問題ありません。

于 2017-02-10T16:08:45.000 に答える