2016-11-11 108 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中丢失了某处。