1

いくつかのIETFドラフトのバージョンを展開することを計画しており、いくつかのコード参照またはガイダンスが必要です。基本的なTCPソケットに精通していますが、要件をコードに変換する方法を知りたいです。

例:Session Initiation Protocol(SIP)Common Log Format(CLF)の形式

翻訳方法を知りたい:

 0          7 8        15 16       23 24         31
  +-----------+-----------+-----------+-----------+
  |  Version  |           Record Length           | 0 - 3
  +-----------+-----------+-----------+-----------+

   Version (1 byte):  0x41 for this document; hexadecimal encoded.

   Record Length (6 bytes):  Hexadecimal encoded total length of this
  log record, including "Flags" and "Record Length" fields, and
  terminating line-feed.

コードに。バージョンを定義するにはどうすればよいですか?どのタイプですか?Int、charなど?

ありがとう

4

4 に答える 4

2

主なツールはDataOutputStream. すべてのプリミティブ型を処理し、ネットワークのバイト順も処理します。DataInputStream受信機で。あなたのVersionフィールドは で書かれwrite()ます。

于 2012-09-07T01:35:55.217 に答える
2

Java には符号なしの型が含まれていないため、いくつかの問題が発生します。エンディアンの問題も発生する可能性があります (Java は常にビッグ エンディアンです)。プロトコル仕様で 16 ビットの符号なし整数フィールドが存在することが規定されている場合は、32 ビットの符号付き整数で値を保持し、バイト単位でネットワーク ストリームとの間で未加工のバイトを書き出す (または読み取る) 必要があります。InputStream のread()メソッドは個々のバイトをint値として返すことに注意してください。

あなたの例を読む方法は次のとおりです。

InputStream stream = getNetworkInputStream();
int version = stream.read();

int recordLength0 = stream.read();
int recordLength1 = stream.read();
int recordLength2 = stream.read();
int recordLength3 = stream.read();

long recordLength = recordLength0 << 24 | recordLength1 << 16 | recordLength2 << 8 | recordLength; // perform the bitwise OR of all four values

書くことは少し苦痛です。byte署名されているため、型を内部で使用する場合は注意してください。

int version; long recordLength;

OutputStream stream = getNetworkOutputStream();
stream.write( version ); // the write(int) method only writes the low 8 bits of the integer value and ignores the high 24 bits.

stream.write( recordLength >> 24 ); // shift the recordLength value to the right by 8 bits
stream.write( recordLength >> 16 );
stream.write( recordLength >>  8 );
stream.write( recordLength       );
于 2012-09-07T01:36:05.483 に答える
1

ゼロから作成する代わりに、Jboss NettyApache MinaGrizzlyなどのアプリケーションを使用することをお勧めします。これらは、特に高性能プロトコル開発を対象としています。

これは、 Grizzly が SIP のサポートに使用されている例です。

于 2012-09-07T05:00:19.383 に答える
1

ByteBufferを使用して、バイトを個々の変数に変換します。バイトオーダーを処理できます。

于 2012-09-07T01:39:31.290 に答える