通信用にバイトベースの接続指向プロトコルに依存する 2 つの Java プロジェクト (単純なマルチプレイヤー ゲーム) がありました。
どちらの場合も、私は通信の実装に不満を持っていました。なぜなら、インテリジェントで、冗長でなく、オブジェクト指向の書き込み方法、特にバイトの解析方法を思いつくことができなかったからです。
書くために、私は次のようなものを持っていました
ProtocolDataUnitX pdux = new ProtocolDataUnitX("MyName", 2013);
int[] bytes = pdux.getBytes();
out.write(bytes); // surrounded with try/catch etc.
AbstractPDU
いくつかのバイト変換の便利なメソッドを持つクラスがあったので、それはある程度受け入れられました。getBytes()
しかし、プロトコル データ ユニット (pdu) ごとにメソッドを定義する必要がありました。着信バイト ストリームを解析するための私のアプローチには、それ以上の革新がありませんでした。
private InputStream in;
...
@Override
public void run() {
int c;
while ((c = in.read()) != -1)) {
if (c == 0x01) {
// 0x01 means we have pdu #1 and can continue reading
// since we know what is coming.
// after we have all bytes and know the pdu
// we can determine the paramters. I.e., every pdu has a
// reverse constructor: bytes -> pdu
}
質問
これらの状況をどのように処理しますか? ここでのベストプラクティスは何ですか? 一部のプロトコルでは、全長フィールドがエンコードされていますが、エンコードされていないプロトコルもあります。一部のプロトコル データ ユニットは可変長です。ここに合理的なアプローチはありますか?たぶん、ある種のスキーマ定義ですか?この件に関して、これ以上醜くて紛らわしいコードを作成したくありません。