0

I am working on a P2P simple system and i have a problem when the client after successfully locates the file on the index server, tries to obtain the file requested. It seems through the research i have already done that there is a problem when binding to the server's rmiregistry which is "CentralIndex" in my case. The client cannot bound the lookup() object. Please HELP!. Server's code (working great):

public class CIServer implements SharedInterface{

Hashtable<String,Integer> rmiregistry;

public CIServer(){
    super();
    this.rmiregistry = new Hashtable<String,Integer>();
}

@Override
public int peerSearch(String filename){

    if(rmiregistry.containsKey(filename)){
        return rmiregistry.get(filename);
    }
    System.out.println("The file does not exist.");
    return 1000;
}

@Override
public boolean insertToRegistry(int peerID,String filename){
    rmiregistry.put(filename, peerID);
    return rmiregistry.isEmpty();
}

public static void main(String[] args){
    System.setProperty("java.security.policy", "server.policy");
    //System.setProperty("java.rmi.server.codebase", "file:/build/classes");

    if (System.getSecurityManager() == null){
        System.setSecurityManager(new SecurityManager());
    }

    try{
    String servername = "CentralIndex";
    SharedInterface handler = new CIServer();        
    SharedInterface stub = (SharedInterface) UnicastRemoteObject.exportObject(handler,0); 
    Registry reg = LocateRegistry.getRegistry();
    reg.rebind(servername, stub);
    System.out.println("CentralIndex service bound");
    }catch (Exception e){
    System.err.println("CentralIndex exception: ");
    e.printStackTrace();
    }
}

}

client's code:

public class RMIClient {
static String ServerName = "CentralIndex";
static int peerID = 1;
static File fileDirectory = new File("Client_files\\");
static String downloadDirectory = "temp";

boolean download(byte[] file, String filename){
    BufferedOutputStream out;
    try{
        out = new BufferedOutputStream
                (new FileOutputStream(downloadDirectory+filename));
        out.write(file, 0, file.length);
        out.flush();
        out.close();
    }catch (FileNotFoundException e){
        System.err.println("This file path does not exist.");
        e.printStackTrace();
        return false;
    }catch (IOException e){
        e.printStackTrace();
        return false;
    }
    return true;        
}

void directoryCheck(SharedInterface file){
    String[] subDirectory = fileDirectory.list();
    if (subDirectory == null) {

    }else {
        for (int c = 0; c < subDirectory.length; c++){
            String name = subDirectory[c];
            try{
                file.insertToRegistry(peerID, name);                    
            }catch (RemoteException e){
                System.err.println("Registry error");
                e.printStackTrace();
            }
        }
    }
}

public static void main(String[] args){        
    RMIClient client = new RMIClient();
    Scanner in = new Scanner(System.in);
    int peerAsServerID = 0;
    System.out.println("##############################\n"
            + " Welcome to AARK p2p network. \n"
            + "##############################");
    System.out.println("To search a file just\n"
            + " type the name below: \n -->");
    String filename = in.nextLine();
    System.setProperty("java.security.policy", "client.policy");
    if (System.getSecurityManager() == null) {
        System.setSecurityManager(new SecurityManager());
    }
    try {
            Registry reg = LocateRegistry.getRegistry();
            SharedInterface handler = (SharedInterface) reg.lookup(ServerName);
            client.directoryCheck(handler);
            peerAsServerID = handler.peerSearch(filename);
            System.out.println(peerAsServerID);

            if (peerAsServerID == 1000){
                System.out.println("No such file.");
            }else {
                System.out.println("File "+filename+" found on peer: "+peerAsServerID);
            }
        }catch (Exception e){
            System.err.println("Handler exception");
            e.printStackTrace();
        }


        try{
            if (peerAsServerID == 1000 || peerAsServerID == 0){
                System.out.println("File:"+filename+" not found.");
            } else{

                String clientAsServerName = String.valueOf(peerAsServerID);     

                Registry reg = LocateRegistry.getRegistry();

                Handler stub = (Handler)reg.lookup(clientAsServerName);

                byte[] file = stub.obtain(filename);


                if (client.download(file,filename)){
                    System.out.println("Download successful.\n "
                            + "The requested file is at your temp folder.");
                }else{
                    System.out.println("Download unsuccessful.\n"
                            + " There was a problem. Please try again.");
                }
            }
         }catch (Exception e){
            System.err.println("Download exception");
            e.printStackTrace();
            }
}
}

Interface:

public interface SharedInterface extends Remote {
int peerSearch (String filename) throws RemoteException;
boolean insertToRegistry(int peerID, String filename) throws RemoteException;
}

another interface used by clients as servers:

public interface Handler extends Remote {
byte[] obtain(String filename) throws RemoteException;
}

and this is finally what i got:

file5.txt
File found on peer: 2
Download exception
java.rmi.NotBoundException: 2
at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:136)
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:409)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
at sun.rmi.transport.Transport$1.run(Transport.java:177)
at sun.rmi.transport.Transport$1.run(Transport.java:174)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at RMIClient2.RMIClient2.main(RMIClient2.java:94)
    BUILD SUCCESSFUL (total time: 2 seconds)

PLease someone help me fix that asap! Thank you all in advance.

4

1 に答える 1