私はJavaで小さなマルチプレイヤーゲームを作ろうとしています。tpc接続は機能しましたが、今のところ送信できるのは文字列のみです。ゲームの同期に必要なすべてのデータを含む、より高度なデータをパケットで送信したいと思います。ある種のカスタム構造、またはクラスインスタンスからのデータを1つのtcpパッケージで送信することは可能ですか?またはそれを行うための良い方法は何でしょうか(私はグーグルで検索しましたが、私のニーズに合うものを見つけることができませんでした)?
4 に答える
一般に、ここで探すキーワードはserializationです。これは、データ構造を、ソケットまたは他の伝送媒体を介して送信できるバイトのチャンクに変換するプロセスです。
これを行う 1 つの方法は、Java で使用するバインディングを含むGoogle Protocol Buffersライブラリを使用することです。
最も基本的でありながら最適ではない方法は、Serializable -marker インターフェースを使用することです。たとえば、こちらを参照してください: Discover the secret of the Java Serialization API .
より良い方法は、いくつかのバイナリ プロトコルを使用することです。いくつかの例については、こちらを参照してください:汎用バイナリ プロトコルまたは独自のクック。
I would like to transmit more sophisticated data in packets, which would contain all the necessary data for synchronizing the game.
これらのデータがSerializable
(たとえば、データがプリミティブ、文字列とプリミティブの配列、または文字列の配列のみで構成されている)場合は、、などの標準を使用しCollection
てVector
データを保持できます。それらはシリアル化可能です(ドキュメントを確認してください)。したがって、これを使用するために必要なものは次のとおりです。List
Map
objectOutputStream.writeObject(data)
ObjectOutputStream
パケットの送信に使用していると仮定します。ただし、独自のカスタムデータ構造を作成する必要がない場合はjava.io.Serializable
、他の人が指摘しているように、タグを付ける必要があります。
注: Serializableを実装するクラスでは、そのクラスのすべてのインスタンス変数がSerializable型であることを確認する必要があります。
-ソケットを横切るプレーンな String に満足できない場合は、 Use を使用できますSerialization
。
- Serialization
データの書き込みと読み取りに同じ Java プログラムを使用する場合に使用する必要があります。
- Serialization
オブジェクトをそれぞれ格納および取得中にフラット化および膨張させます。
-実際にはオブジェクトではありませんInstance variables
が、保存され、後でヒープ上の同一のオブジェクトを復活させるために使用されます....