Εμφάνιση 1-4 από 4

Θέμα: Java με RMI

  1. #1
    Εγγραφή
    15-01-2011
    Ηλικία
    31
    Μηνύματα
    415
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL OTE
    ISP
    Conn-x OTE
    Καλησπέρα παιδία,

    Προσπαθώ να τελειώσω μια εργασία πάνω σε RMI με Java αλλά έχω κολλήσει στο κομμάτι του client.

    Αυτός είναι ο σέρβερ οποίος καλέι στη main την addServer μεθοδο για να βάλει τον εαυτό του στην λίστα με τους υπόλοιπους σερβερς που καλεί ο client
    Κώδικας:
    package lab1.server;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    import java.rmi.server.UnicastRemoteObject;
    
    import lab1.loadBalancer.ILoadBalancer;
    import lab1.loadBalancer.LoadBalancer;
    
    public class Server implements IFileServer {
    	public Server() {
    		super();
    	}
    
    	public byte[] getFile(String name) {
    		System.out.println("inside getFile method");
    		byte btarray[] = null;
    		try {
    			File file = new File(name);
    			FileInputStream instream = new FileInputStream(file);
    			btarray = new byte[(int) file.length()];
    
    			instream.read(btarray);
    
    		} catch (Exception e) {
    			System.out.println(e.getMessage());
    			e.printStackTrace();
    		}
    		if (btarray == null) {
    			return null;
    		} else {
    			return btarray;package lab1.server;
    
    import java.io.File;
    
    public class Server implements IFileServer {
    	public Server() {
    		super();
    	}
    
    	public byte[] getFile(String name) {
    		System.out.println("inside getFile method");
    		byte btarray[] = null;
    		try {
    			File file = new File(name);
    			FileInputStream instream = new FileInputStream(file);
    			btarray = new byte[(int) file.length()];
    
    			instream.read(btarray);
    
    		} catch (Exception e) {
    			System.out.println(e.getMessage());
    			e.printStackTrace();
    		}
    		if (btarray == null) {
    			return null;
    		} else {
    			return btarray;
    		}
    
    	}
    
    	public static void main(String[] args) {
    		try {
    			Server s = new Server();
    			IFileServer stub = (IFileServer) UnicastRemoteObject.exportObject(s, 0);
    			
    			// create a remote reference to the registry
    			Registry registry = LocateRegistry.getRegistry("localhost");
    			
    			// ILoadBalancer is an interface that contains the method addServer
    			ILoadBalancer il = (ILoadBalancer) registry.lookup("loadBalancer");
    			il.addServer(stub);
    			
    			
    		} catch (Exception e) {
    			System.err.println("Exception:");
    			e.printStackTrace();
    		}
    	}
    }
    
    		}
    
    	}
    
    	public static void main(String[] args) {
    		try {
    			Server s = new Server();
    			IFileServer stub = (IFileServer) UnicastRemoteObject.exportObject(s, 0);
    			
    			// create a remote reference to the registry
    			Registry registry = LocateRegistry.getRegistry("localhost");
    			
    			// ILoadBalancer is an interface that contains the method addServer
    			ILoadBalancer il = (ILoadBalancer) registry.lookup("loadBalancer");
    			il.addServer(stub);
    			
    			
    		} catch (Exception e) {
    			System.err.println("Exception:");
    			e.printStackTrace();
    		}
    	}
    }
    H LoadBalancer κλάση καλεί και διατυπώνει τις μεθόδους απο το ILoadBalancer interface
    Κώδικας:
    package lab1.loadBalancer;
    
    import java.rmi.NotBoundException;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    import java.rmi.server.UnicastRemoteObject;
    import java.util.ArrayList;
    import java.util.Random;
    
    import lab1.server.IFileServer;
    
    public class LoadBalancer implements ILoadBalancer {
    	private ArrayList<IFileServer> iserver =  new ArrayList<IFileServer>();
    	private IFileServer fileServer;
    	
    	
    	public LoadBalancer(){
    		super();	
    	}
    	
    	public void addServer(IFileServer s) throws RemoteException {
    		System.out.println("In addServer method");
    		
    		iserver.add(s);	
    		
    		System.out.println("List size 1: " + iserver.size());
    		
    	}
    
    	public IFileServer getServer() throws RemoteException {
    		System.out.println("Size: " + iserver.size());
    		return iserver.get(0);
    	}
    	
    	
    	public static void main(String[] args) throws RemoteException{
    		System.out.println("loadbalancer main method");
    		
    		LoadBalancer balancer = new LoadBalancer();
    		String name = "loadBalancer";
    		
    		Registry registry = LocateRegistry.getRegistry();
    		ILoadBalancer stub = (ILoadBalancer) UnicastRemoteObject.exportObject(balancer, 0);
    		registry.rebind(name, stub);
    
    		
    		
    	}
    
    }
    Το πρόβλημα είναι όταν καλώ την getServer μέθοδ, γυρίζει null σερβερ αλλά δεν πρέπει γιατι το ArrayList στην LoadBalancer κλάση δεν είναι άδειο.
    Κώδικας:
    package lab1.client;
    
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    
    import lab1.server.IFileServer;
    import lab1.loadBalancer.ILoadBalancer;
    import lab1.loadBalancer.LoadBalancer;
    
    public class Client  {
    	public static void main(String[] args) {
    		LoadBalancer bl = new LoadBalancer();
    		
    		if (args.length < 1) {
    			System.out.println("Usage: java Client filename");
    			return;
    		}
    
    		String filename = args[0];
    		try {
    			
    			IFileServer server = bl.getServer();
    			
    			System.out.println("get the file");
    			System.out.println("server: " + server);
    			
    			byte result[] = server.getFile(filename);
    			
    			if (result != null)
    				System.out.println("File is " + result.length + " bytes");
    			else
    				System.out.println("File not found!");
    			
    		} catch (Exception e) {
    			System.err.println("Exception:");
    			e.printStackTrace();
    		}
    	}
    }

  2. #2
    Εγγραφή
    02-11-2003
    Περιοχή
    Επαναπατρισθείς στην Αθήνα
    Ηλικία
    49
    Μηνύματα
    56.427
    Downloads
    64
    Uploads
    73
    Τύπος
    VDSL2
    Ταχύτητα
    102400/10240
    ISP
    Vodafone
    Path Level
    Fastpath
    Δεν γνωρίζω τις συγκεκριμένες κλάσεις.

    Το μόνο που μπορώ να σκεφτώ απλά διαβάζοντας τον κώδικα είναι ότι εδώ:

    Κώδικας:
    IFileServer stub = (IFileServer) UnicastRemoteObject.exportObject(s, 0);
    Είτε ότι:
    - το stub δεν παίρνει ποτέ τιμή να γίνει initialized, για κάποιο λόγο, και παραμένει NULL (ή NAN -> aka not a number)
    - το typecasting που κάνεις, για κάποιο λόγο, δεν είναι σωστό

  3. #3
    Εγγραφή
    06-05-2006
    Ηλικία
    43
    Μηνύματα
    1.426
    Downloads
    2
    Uploads
    0
    Τύπος
    VDSL2
    ISP
    OTE
    Router
    SpeedportEntry 2i
    Με όλες τις πιθανότητες να λέω βλακείες γιατί το είδα πολύ γρήγορα, παρατήρησα τα εξής:
    -Στην κλάση Client φτιάχνεις ένα νέο αντικείμενο LoadBalancer b1. Λογικό δεν είναι η iserver του να είνα άδεια? Πότε της έβαλες κάτι με b1.add....
    -Ενώ η LoadBalancer κάνει implement ένα interface και όχι extend, υπάρχει μια ακατανόητη κλήση στην super(). Έτσι όπως το βλέπω εγώ καλείται ο constructor της Object , ελπίζω να μην νομίζεις πως καλλείται τίποτα στο interface.

    Sorry αλλά δεν ασχολήθηκα περισσότερο μετά από αυτό το σημείο, θεωρώ ότι υπάρχει κάποιο σοβαρό μπέρδεμα με τα interfaces. Αν δεν βοήθησαν αυτά ευχαρίστως το ξαναβλέπουμε.

  4. #4
    Εγγραφή
    15-01-2011
    Ηλικία
    31
    Μηνύματα
    415
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL OTE
    ISP
    Conn-x OTE
    Καλησπέρα παιδία,

    Ξανακοίταξα τον κώδικα συμφώνα με τις παρατηρήσεις σας και λίγο με μια βοήθεια απο εναν καθηγητή το έφτιαξα το πρόβλημα. Ουσιαστικά, η client κλάση πρέπει να χρησιμοποιεί και αυτή RMI για να πάρει σέρβερς απο την LoadBalancer κλάση.

    Ορίστε ο σωστός κώδικας για τον client
    Κώδικας:
    package lab1.client;
    
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    
    import lab1.server.IFileServer;
    import lab1.loadBalancer.ILoadBalancer;
    import lab1.loadBalancer.LoadBalancer;
    
    public class Client {
    	public static void main(String[] args) {
    		// LoadBalancer bl = new LoadBalancer();
    
    		if (args.length < 1) {
    			System.out.println("Usage: java Client filename");
    			return;
    		}
    
    		String filename = args[0];
    		try {
    			// create a remote reference to the registry
    			Registry registry = LocateRegistry.getRegistry("localhost");
    
    			// ILoadBalancer is an interface that contains the method addServer
    			ILoadBalancer il = (ILoadBalancer) registry.lookup("loadBalancer");
    
    			IFileServer server = il.getServer();
    
    			System.out.println("get the file");
    
    			byte result[] = server.getFile(filename);
    
    			if (result != null)
    				System.out.println("File is " + result.length + " bytes");
    			else
    				System.out.println("File not found!");
    
    		} catch (Exception e) {
    			System.err.println("Exception:");
    			e.printStackTrace();
    		}
    	}
    }

Παρόμοια Θέματα

  1. Αρχιτεκτονική με Java κληρονομικότητα
    Από Pekovits στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμού
    Μηνύματα: 7
    Τελευταίο Μήνυμα: 15-01-15, 23:46
  2. Μηνύματα: 22
    Τελευταίο Μήνυμα: 03-12-14, 19:19
  3. Μηνύματα: 11
    Τελευταίο Μήνυμα: 11-05-14, 13:08
  4. Java print preview for JTable
    Από djastral232 στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμού
    Μηνύματα: 0
    Τελευταίο Μήνυμα: 09-04-14, 13:29
  5. Μηνύματα: 10
    Τελευταίο Μήνυμα: 13-02-14, 17:48

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας