3

サーバーが50ミリ秒ごとにソケットを介してクライアントに画像(100kb)を送信するサーバークライアントモデルを使用して、C#アプリケーションを構築しています...

私は TCP を使用していましたが、このプロトコルのオーバーヘッドに加えて、クライアントのソケットに複数のイメージが存在することもありました。そして、各画像のバイトを分割する巧妙なメカニズムについてはまだ考えていません (実際には、最新のものだけが必要です)。

UDP を使用してみましたが、100kb の dgram は送信できず、64kb の dgram しか送信できないという結論に達しました。それでも、1500 バイトを超えて使用するべきではありません。そうしないと、パケットがネットワークに沿って分割され、パケットの一部が失われる可能性が高くなります。

だから今、私は少し混乱しています。クライアントがイメージを分離できるように、TCP を使用し続け、各イメージの末尾にエスケープ バイトを挿入する必要がありますか? それとも、UDP を使用して 1500 バイトの dgram を送信し、順序付けと回復のメカニズムを考え出す必要がありますか?

ここでの重要な目標は、画像を非常に高速に送信することです。クライアントが新しいものを受け取り続ける限り、途中でいくつかを失うことは気にしません.

または、別のプロトコルを使用する必要がありますか? 前もって感謝します!

4

5 に答える 5

15

Real-time Transport Protocol (別名RTP ) の使用を検討する必要があります。

RTP で使用される基礎となる IP プロトコルは UDP ですが、タイムスタンプ、シーケンス順序などを示す追加のレイヤーがあります。

RTP は、VoIP および video-over-IP システムで使用される主要なメディア転送プロトコルです。プロトコルの既存の C# 実装が見つからない場合は、非常に驚​​かれることでしょう。

また、画像ファイルが JPEG 形式の場合、RTP/MJPEG ストリームを生成できるはずです。一部の IP ウェブカメラはその形式で出力されるため、このようなストリームを受信して​​表示するためのネイティブ サポートを既に備えているビデオ ビューアがかなりあります。

于 2009-04-15T23:11:18.170 に答える
2

まず第一に、何をしてもネットワークがこれを処理できない可能性がありますが、私は UDP を使用します。画像を小さなビットに分割してみて、次の画像が到着する前にすべての部分を取得した場合にのみ、各画像を表示することができます。

また、他の人が言及したように RTP を使用するか、UDTを試すことができます。これは、UDP の上にあるかなり軽量で信頼性の高いレイヤーです。TCP よりも高速である必要があります。

于 2009-04-15T23:16:50.293 に答える
1

次の場合は、UDP を使用することをお勧めします。

  • アプリケーションは、通過しない画像または画像の小さなバーストに対処できます。
  • 画像を 65535 バイトに圧縮できます。

ビデオ会議アプリケーションを実装している場合、大部分が UDP を使用していることに注意してください。

それ以外の場合は、TCP を使用して、画像を区切る方法を実装する必要があります。その点での 1 つの提案は、RTPプロトコルを調べることです。VoIP やビデオなどのリアルタイム データを伝送するために特別に設計されています。

編集:私は過去に.Net RTPライブラリについてかなりの回数見回しましたが、非.Netライブラリまたは半分完成したライブラリのラッパーを除いて、あまり成功しませんでした. もう一度簡単に調べてみたところ、これはおそらくこれの 1 つだと思われます

于 2009-04-15T23:14:29.410 に答える
1

他の回答は、UDPまたはRTPのような「実際の」プロトコルに関する適切なオプションをカバーしています。

ただし、TCP に固執したい場合は、必要に応じて単純な「メッセージ」構造を自分で構築してください。最も簡単な?長さの接頭辞。まず、画像の長さを 4 バイトとして送信し、次に画像自体を送信します。クライアントとサーバーを作成するのに十分簡単です。

于 2009-04-15T23:18:14.270 に答える
0

すべての画像よりも最新の画像が重要な場合は、UDP を最初に選択する必要があります。

しかし、64K より大きいフレームを扱っている場合は、なんらかの形で自分自身をリフレーミングする必要があります。断片化されたフレームは気にしないでください。処理する必要があるか、下のレイヤーが処理する必要があります。そして、完成した写真だけが必要です。

必要なのは、タイムスタンプ/シーケンスを使用した何らかの形式のカプセル化です。

于 2009-04-15T23:13:24.373 に答える