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

ありがとう!

+0

このコードはすべて無関係です。シリアライズされているクラスを投稿するだけです。あなたはそれを送るためにグループに参加する必要はなく、送信のために 'MulticastSocket'を使うこともできます。 – EJP

答えて

3

ので、すべての可能性は、いくつかの質問によって除外が含ま属性をカバーするためにlocalDirectory次のいずれかのシリアル化された

  • static
  • とき
    • がnullだった

      transient
    • が書かれていないですカスタムでwriteObject()メソッド
    • はカスタムで割り当てられていませんreadObject()メソッド
    • は、シリアライズされたクラスのバージョンにも存在しませんでしたが、デシリアライズされたバージョンにあった
    • は、writeReplace()/readResolve()メジヤのどこかで失われました。
  • 関連する問題