3

私は Netty の初心者であり、TCP クライアントが可変長のバイナリ レコード (16 進数) を送信したり、可変長の ASCII レコードを送信したりするときに、着信 TCP データをどのように読み取り/処理するのか疑問に思っています。または改行。

TCP クライアントは、次のようにバイト ストリームを送信しています。

  1. 「$」で始まり、バイト数が変化し、文字で終了しないバイトのバイナリ ストリーム。

  2. '(' で始まり ')' で終わるバイトの ASCII ストリーム

両方のレコード セットが同じポートに到着します。

両方を処理/読み取るために、Netty ベースの TCP サーバーをどのようにコーディングする必要がありますか?

前もって感謝します。

クナル

4

2 に答える 2

5

ポート統合の例を確認してください。それはまさにあなたが望むことをします。

于 2012-04-17T08:25:40.827 に答える
0

まず、すべてを混ぜないでください。'$' は Char です。ほとんどのエンコーディングでは 1 バイトで表すことができますが、これは一般的な char の場合にはほとんど当てはまりません (UTF-8 では、char は可変長でエンコードされ、 1、2、または 3 バイト)。

ストリームの長さによって異なります。

1)送信者のメモリ内に収まる場合、最も簡単な解決策は、2 つのフィールド ヘッダーを持つフレームを使用することです。

  • タイプ (バイトまたは文字列) の 1 バイト
  • フレームの長さ (データのバイト数) に 2 バイト (たとえば、符号なし Int16 を使用)。

それよりも、FrameDecoder を使用してフレーム全体を受信およびデコードできます。

2) ストリームが巨大でメモリ内に収まらない場合は、次の 2 つの解決策があります。

  • ストリームをフレームに分割します(各フレームのヘッダーのために少しオーバーヘッドがあります)。
  • Channel.close()イベントを使用してEndOfStreamに通知します(これは簡単ですが、新しい接続を作成してハンドシェイクを何度も行う必要がある場合は、遅延の問題が発生する可能性があります...

いずれの場合も、NettyはストリングをストリーミングするためのStringEncoderStringDecoderを提供します。また、あらゆる種類の便利なヘッダーを備えたFrameDecoderFrameEncoderもあります。

于 2012-04-17T09:03:25.903 に答える