1
我创建了一个由RMI进行通信的Java服务器和客户端应用程序。为了让客户“见面”服务器,我正在向客户端发送一个多播DatagramPacket。会发生什么是我用属性localDirectory实例化类,当我收到它,它来了空。重要的是说,我试图发送的对象实现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