1
RMIによって通信するJava ServerおよびClientアプリケーションを作成しました。クライアントがサーバーを「満たす」ために、私はマルチキャストDatagramPacketをクライアントに送信します。何が起こるかは、localDirectoryという属性でクラスをインスタンス化し、それを受け取ったときにnullが返されるということです。重要なことは、私が送信しようとしているオブジェクトがSeriaizableを実装していると言うことです。シリアライズされたオブジェクトがデータを失う
私は間違っていると思いますか?
(あなたはaditionalコードが必要な場合は私に知らせて)
public static void main(String[] args) throws RemoteException {
localDirectory = new File("c:\\tempfiles".trim());
serverToTransmit = (ServerInterface) new Server(localDirectory);
if (!localDirectory.exists()) {
System.out.println("Directory " + localDirectory + " does NOT exist!");
return;
}
if (!localDirectory.isDirectory()) {
System.out.println("The path " + localDirectory + " is NOT a directory!");
return;
}
if (!localDirectory.canRead()) {
System.out.println("WITHOUT reading permissions on " + localDirectory + "!");
return;
}
try {
System.out.println("Vou criar o registry");
Registry registry;
try {
System.out.println("Registry lauching try in port " + 7609 + "...");
registry = LocateRegistry.createRegistry(7609);
System.out.println("Registry launched!");
} catch (RemoteException e) {
System.out.println("Registry probably in execution already!");
registry = LocateRegistry.getRegistry();
}
System.out.println("Será que criei?");
//Create Service
//ServerInterface service = new Server(localDirectory);
Server server = new Server(localDirectory);
registry.bind(SERVICE_NAME, server);
System.out.println("Service " + SERVICE_NAME + " registered on registry.");
MulticastSocket sock = new MulticastSocket(7000); //225.15.15.15 e o porto 7000.
InetAddress addr = InetAddress.getByName("225.15.15.15");
sock.joinGroup(addr);
//sock.setTimeToLive(1);
DatagramSocket psock;
while (true) {
try {
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bOut);
out.writeObject(serverToTransmit);
//out.writeUnshared(objectToTransmit) in order to avoid caching issues
out.flush();
byte[] data = bOut.toByteArray();
DatagramPacket packet = new DatagramPacket(data, data.length, addr, 7000);
System.out.println("sizeeee: " + bOut.size());
sleep(3000);
sock.send(packet);
} catch (SocketException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
/* if (args.length > 0 && args[0].equals("leader")) {
playLeader(sock, psock, addr);
} else {
playFollower(sock, psock, addr);
}
sock.leaveGroup(addr);*/
} catch (RemoteException e) {
System.out.println("Remote error - " + e);
System.exit(1);
} catch (Exception e) {
e.printStackTrace();
}
と私は、この(唯一の重要なコードを置く)のように、クライアント上でそれを受けています:
MulticastSocket sock = new MulticastSocket(7000); //225.15.15.15 e o porto 7000.
InetAddress addr = InetAddress.getByName("225.15.15.15");
sock.joinGroup(addr);
sock.setTimeToLive(1);
System.out.println("PASSOU AQUI_!");
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024, addr, 7000);
sock.receive(packet);
System.out.println("PASSOU AQUI_1!");
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(packet.getData(), 0,
packet.getLength()));
System.out.println("PASSOU AQUI_2!");
ServerInterface returnedObject = (ServerInterface) in.readObject();
System.out.println("Returned Object LOCAL DIR -> " + returnedObject.getLocalDirectory());
ありがとう!
このコードはすべて無関係です。シリアライズされているクラスを投稿するだけです。あなたはそれを送るためにグループに参加する必要はなく、送信のために 'MulticastSocket'を使うこともできます。 – EJP