1

私は単純な IM システム (最も単純なバージョンの Windows メッセンジャーによく似ています) の作成に関するネットワーク プログラミングの割り当てに取り組んでいます。

仕様では、1 つのデータグラム パケットで 4 つのフィールドを超えるデータを送信する必要があると指定されています。これらは次のとおりです。

To From Type Message
where type refers to message type, implemented as a user defined enum class.

これらすべてのデータを 1 つのパケットにパックする方法を教えてください。

更新:これまでのところ助けてくれてありがとう、しかし、私は文字列文と文字列を持っていると言いますパケットに個別にパッチを当てる通常の方法からは

byte[] sendData = new byte [256]
sendData = sentence.getBytes();

しかし、「from」文字列を文文字列とともに sendData に正確に追加するにはどうすればよいですか?

4

4 に答える 4

3

このようなものを使用して、シリアル化可能なオブジェクトを送信できます。

ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(buffer);
out.writeObject(objectYouWantToSend);
out.close();
buffer.close();
DatagramPacket packet = new 
    DatagramPacket(buffer.toByteArray(), 
                   buffer.size(), 
                   InetAddress.getByName(...),
                   portNumber);
socket.send(packet);
于 2009-04-18T08:46:24.913 に答える
2

簡単に言えば、あなたがする必要があるのは次のとおりです。

  1. 4 つのフィールド (from/to/enum/message) を含むオブジェクト (クラス) を作成します。
  2. これをシリーズ化します。Serializableを実装する必要があります。シリアル化する方法については、こちらの他のソリューションを参照してください
  3. バイト配列に変換し、ソケットを送信します (詳細については、他の場所を参照してください)。

もう一方の端では、このバイトストリームを読み取り、デシリアライズして、上記の 1. で定義したクラスのインスタンスにキャストします。

4 つのフィールドを含む 1 つのオブジェクトを作成し、このオブジェクトをシリアル化することで、4 つのフィールドすべてをまとめて送信できます (これが障害ではないかという印象を受けます)。

データグラムには、ネットワーク トランスポート層によって課されるサイズ制限があることに注意してください。ただし、このアプリケーションでは、それは問題ではないと思います。

于 2009-04-18T09:22:08.197 に答える
1

それらをネットワーク インターフェイスに渡す前に追加するだけです。次のようなもの:

byte[] buff = new byte[256];
// Add al your fields here to buff.
DatagramPacket packet = new DatagramPacket(buff, buff.length, address, 1234);
socket.send(packet);

すべてが文字列でない場合は、そのようにエンコードする必要があります。

于 2009-04-18T07:47:12.590 に答える
0

データをエンコードするためのオプションはたくさんありますが、それらはすべて、4 つのフィールドを 1 つのデータ構造に入れ、それを一度に送信することに帰着します。

重要な部分は、エンコーディングでは、4 つのフィールドのどれがパケットのどの時点にあるかを示す必要があるということです。そうしないと、遠端で確実にデコードできなくなります。

于 2009-04-18T07:49:46.127 に答える