ソケットを介してDataOutputStreamを使用してポイントの配列(Point points [] = new point [20])を送信し、反対側のDataInputStreamを使用して正しく読み取ることができるようにします。各要素を個別に送信することはできません。配列全体として送信する必要があり、配列全体として解釈できる必要があります。
3 に答える
1
たとえば、高度なソケットプログラミングの「カスタムオブジェクトの転送」のセクションを参照してください。
- MyDataなどのSerializableクラスにデータを配置します。(配列はSerializableを実装しているため、実際にこれを行う必要はありませんが、後でポイント配列と一緒に他のデータを送信したくなる可能性があります...)
- 送信者側で、MyDataオブジェクトを作成し、データを入力します。socket.getOutputStream()をObjectOutputStreamにキャストし、そのwriteObjectメソッドを呼び出してMyDataオブジェクトを送信します。
- 受信側で、 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...
DataObject
Point[]; プロパティの 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 に答える