0

ソケットを介してDataOutputStreamを使用してポイントの配列(Point points [] = new point [20])を送信し、反対側のDataInputStreamを使用して正しく読み取ることができるようにします。各要素を個別に送信することはできません。配列全体として送信する必要があり、配列全体として解釈できる必要があります。

4

3 に答える 3

1

たとえば、高度なソケットプログラミングの「カスタムオブジェクトの転送」のセクションを参照してください。

  1. MyDataなどのSerializableクラスにデータを配置します。(配列はSerializableを実装しているため、実際にこれを行う必要はありませんが、後でポイント配列と一緒に他のデータを送信したくなる可能性があります...)
  2. 送信者側で、MyDataオブジェクトを作成し、データを入力します。socket.getOutputStream()をObjectOutputStreamにキャストし、そのwriteObjectメソッドを呼び出してMyDataオブジェクトを送信します。
  3. 受信側で、 socket.getInputStream()をObjectInputStreamにキャストし、そのreadObjectメソッドを呼び出してオブジェクトを受信します(オブジェクトをMyDataにキャストする必要があります)。

とにかく、 RMIの使用も検討します。たとえば、PointServerを作成し、それをRMIレジストリに登録し、クライアントアプリケーションの単純な関数呼び出しを介してそれにアクセスできます。RMIは、ソケットよりもはるかに簡単に操作できます。たとえば、プロトコルを設計する必要はなく、分散オブジェクトのメソッドを定義するだけで済みます。

于 2012-06-20T22:51:21.513 に答える
0

代わりに ObjectInputStream/ObjectOutputStream を使用しないのはなぜですか?

これは私がずっと前に書いたコードの一部です。これにより、明らかにシリアライズ可能である限り、あらゆる種類のオブジェクトをネットワーク経由で送信できます。

ObjectInputStream input = new ObjectInputStream(communicationSocket.getInputStream());
if (input != null) {
   try {
    Object o = input.readObject();
       if (o != null && o instanceof DataObject) {
      DataObject response = (DataObject) o;
           {
               //Do something cool with DataObject
           }
   }
}//etc...

DataObjectPoint[]; プロパティの 1 つとして定義できる単なる「ラッパー」/カスタム クラスです。つまり、DataObject を次のように定義できます。

import java.io.Serializable;

public class DataObject implements Serializable {

   private Point[] points; //etc - define getter setter for points
}

そして、次のように書くことができます:

output = new ObjectOutputStream(communicationSocket
                    .getOutputStream());
output.writeObject(yourDataObject);

これで、次のように読むことができます。

while (listening) {  
    try {
   Object currentObject = input.readObject();
   if (currentObject != null
    && currentObject instanceof DataObject) {
       Point[] points = ((DataObject) currentObject).getPoints();
           //Do something with points
   }
} 
    catch (IOException e) {
   e.printStackTrace();
} 
    catch (ClassNotFoundException e) {
   e.printStackTrace();
} 
    finally {
   listening = false;
}
}
于 2012-06-20T23:29:58.510 に答える