2016-11-11 74 views
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()); 

謝謝!

+0

所有這些代碼都是不相關的。您只需發佈正在序列化的類。注意你不需要加入組發送給它,或者甚至使用'MulticastSocket'來發送。 – EJP

回答

3

因此,要覆蓋所有的可能性,包括一些排除您的問題,則該屬性localDirectory之一:

  • 爲空時,序列化
  • static
  • transient
  • 沒有寫入通過自定義writeObject()方法
  • 未被定製readObject()方法
  • 甚至還沒有出現在獲得序列化的類的版本中,但是在得到反序列化的版本中
  • 在某個writeReplace()/readResolve() megillah中丟失了某處。