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