0

TCP ソケットを使用する Java で作成された 2 つのプログラム間で多くのメッセージを送信したいとします。

最も便利な方法は、次のようなオブジェクトを送信することだと思います。

PrintStream ps = new PrintStream(s.getOutputStream());

ObjectOutputStream oos = new ObjectOutputStream(ps);

  some_kind_of_object_here;

  oos.writeObject(some_kind_of_object_here);

 ps.print(oos);

文字列、数値、HashMap、ブール値を送信したいのですが、これらすべてのプロパティを格納できる fx 1 オブジェクトを使用してこれを行うにはどうすればよいですか? シリアル化可能な ArrayList について考えましたが、そこにすべてを配置できますが、エレガントな方法ではありません。サーバーが実行できるさまざまなオプションからユーザーが選択できるため、さまざまな種類のデータを送信したいと考えています。何かアドバイスはありますか?

4

4 に答える 4

2

RMI の使用を検討したことはありますか?

それ以外の場合は、さらにパフォーマンスが必要な場合は、Serializableまたはを使用してください。Externalizable

リストのようなラッパー クラスは必要ありません。もちろん、関連するすべてのデータを一緒に保持する独自のラッパー オブジェクトを作成することもできます。このような「アプリケーション データ ユニット」は、エンティティを送信する正しい順序を管理するのに役立ちます。すべてのメンバーが である限り Serializable、オブジェクト ストリームにラッパー オブジェクトを配置すると、完全なオブジェクト グラフが自動的にシリアル化されます。

ラッパー クラスを使用しない場合は、転送するすべてのオブジェクト/タイプが少なくともSerializable. 次に、データ送信の順序が、データの到着以外の順序と一致していることを確認する必要があります。

于 2010-05-01T11:06:44.513 に答える
1

マスター、シリアル化可能なオブジェクトをソケット経由で別の JVM に送信できることをご存知ですか?

その場合、最も簡単な方法は、すべてのオブジェクトを含むシリアライズ可能なオブジェクトを作成し、それを転送することです。オブジェクトのリストはおそらく最も単純です。次に、反対側でそれを逆シリアル化し、必要な方法でリスト内のオブジェクトを処理できます。

Java のシリアライゼーション テクノロジについて読んでおくことをお勧めします。そうすれば、実行できるスマートなことをすべて理解できます。

http://java.sun.com/javase/7/docs/technotes/guides/serialization/index.html

于 2010-05-01T13:45:12.933 に答える
1

コードを書いた方法で、すでに任意のJava オブジェクトを送信できます。もちろん、これらのオブジェクトには「文字列、数値、HashMap、ブール値」が含まれます。

ByteArrayOutputStream に書き込むだけです。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.write(javaObject);
oos.close();
socket.write(baos.toByteArray())
于 2010-05-01T12:26:19.113 に答える
0

パケットを小さく保つ必要がある場合は、プレーンを使用して、必要Object[]なものを内部に配置し、パケットの種類を指定する列挙型を使用して、メッセージ内に格納するオブジェクトの数と種類を指定できます。

class Message
{
  Type t;
  Object[] params;
}

もちろん、すべてのパケットをどう処理するかを選択する際には、に応じて切り替える必要がありますType tが、プロトコルは通常 FSM であるため (コーディング内容によって異なります)、スペースを浪費したり、必要のないときにリストを割り当てたりすることなく、うまく機能します。

于 2010-05-01T11:27:21.407 に答える