Καλησπέρα παιδία,
Προσπαθώ να τελειώσω μια εργασία πάνω σε RMI με Java αλλά έχω κολλήσει στο κομμάτι του client.
Αυτός είναι ο σέρβερ οποίος καλέι στη main την addServer μεθοδο για να βάλει τον εαυτό του στην λίστα με τους υπόλοιπους σερβερς που καλεί ο client
H LoadBalancer κλάση καλεί και διατυπώνει τις μεθόδους απο το ILoadBalancer interfaceΚώδικας: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(); } } }
Το πρόβλημα είναι όταν καλώ την getServer μέθοδ, γυρίζει null σερβερ αλλά δεν πρέπει γιατι το ArrayList στην LoadBalancer κλάση δεν είναι άδειο.Κώδικας: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); } }
Κώδικας: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(); } } }
Εμφάνιση 1-4 από 4
Θέμα: Java με RMI
-
01-02-15, 21:45 Java με RMI #1
-
01-02-15, 23:41 Απάντηση: Java με RMI #2
Δεν γνωρίζω τις συγκεκριμένες κλάσεις.
Το μόνο που μπορώ να σκεφτώ απλά διαβάζοντας τον κώδικα είναι ότι εδώ:
Κώδικας:IFileServer stub = (IFileServer) UnicastRemoteObject.exportObject(s, 0);
- το stub δεν παίρνει ποτέ τιμή να γίνει initialized, για κάποιο λόγο, και παραμένει NULL (ή NAN -> aka not a number)
- το typecasting που κάνεις, για κάποιο λόγο, δεν είναι σωστό
-
02-02-15, 15:59 Απάντηση: Java με RMI #3
Με όλες τις πιθανότητες να λέω βλακείες γιατί το είδα πολύ γρήγορα, παρατήρησα τα εξής:
-Στην κλάση Client φτιάχνεις ένα νέο αντικείμενο LoadBalancer b1. Λογικό δεν είναι η iserver του να είνα άδεια? Πότε της έβαλες κάτι με b1.add....
-Ενώ η LoadBalancer κάνει implement ένα interface και όχι extend, υπάρχει μια ακατανόητη κλήση στην super(). Έτσι όπως το βλέπω εγώ καλείται ο constructor της Object , ελπίζω να μην νομίζεις πως καλλείται τίποτα στο interface.
Sorry αλλά δεν ασχολήθηκα περισσότερο μετά από αυτό το σημείο, θεωρώ ότι υπάρχει κάποιο σοβαρό μπέρδεμα με τα interfaces. Αν δεν βοήθησαν αυτά ευχαρίστως το ξαναβλέπουμε.
-
04-02-15, 00:38 Απάντηση: Java με RMI #4
Καλησπέρα παιδία,
Ξανακοίταξα τον κώδικα συμφώνα με τις παρατηρήσεις σας και λίγο με μια βοήθεια απο εναν καθηγητή το έφτιαξα το πρόβλημα. Ουσιαστικά, η 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(); } } }
Παρόμοια Θέματα
-
Αρχιτεκτονική με Java κληρονομικότητα
Από Pekovits στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμούΜηνύματα: 7Τελευταίο Μήνυμα: 15-01-15, 23:46 -
Το 2015 θα μπλοκαριστεί η χρήση της Java και άλλων plugins στον Chrome
Από anon στο φόρουμ ΕιδήσειςΜηνύματα: 22Τελευταίο Μήνυμα: 03-12-14, 19:19 -
Δικαστήριο των ΗΠΑ δέχεται πως τα Java APIs προστατεύονται από copyright και δικαιώνει την Oracle εναντίον της Google
Από nnn στο φόρουμ ΕιδήσειςΜηνύματα: 11Τελευταίο Μήνυμα: 11-05-14, 13:08 -
Java print preview for JTable
Από djastral232 στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμούΜηνύματα: 0Τελευταίο Μήνυμα: 09-04-14, 13:29 -
Διαφορετικές εκδόσεις Java (32bit & 64bit) στο ίδιο μηχάνημα...
Από sadako στο φόρουμ WindowsΜηνύματα: 10Τελευταίο Μήνυμα: 13-02-14, 17:48
Bookmarks