Hi Leute!
Ich will eine Client-Server Anwendung mit RMI schreiben.
Um etwas genauer zu werden:
Der Server Teil soll auf einem eigens dafür angeschafften Server laufen während der Client auf unterschiedlichen Rechnern laufen wird.
Der Server soll vor allen Dingen Datenbank Querys in seinen lokalen Speicher schreiben. Die Datenbak beinhaltet sehr viele Datensätze die oft durchlaufen werden müssen um nach verschiedenen Werten zu schauen. In wie weit das funktioniert und der Speicher ausgelastet wird muss man dann mal schauen. Jedenfalls ist es absolut unpraktikabel wenn der Client jedes Mal ein eigenes Query absetzt und auf dessen Ergebnis warten müsste. Ich denke beim Server an 8GB RAM und hoffe das reicht aus. Es kommen nur einmal täglich neue Daten so das man das Rowset nur einmal am Tag füllen müsste.
Server und Client laufen NICHT auf dem gleichen Rechner. Ich hoffe das lässt sich mit RMI programmieren. Sonst müsste ich das ganze als Sockets selber schreiben.
Da ich aber vorher noch mit RMI gearbeitet habe möchte ich erstmal nur ein kleines Programm haben das einen einfachen String vom Server zurückgibt um die funktionsweise zu verstehen.
Server
Remote Interface
Remote Implementation
Registry
Das lässt sich kompilieren und erfolgreich starten durch aufruf des .jar Files.
Client
Ich möchte das der String nach dem betätigen eines jButtons in die Konsole geschrieben wird.
Das Problem: Natürlich kann ich das so nicht kompilieren da das TestService Interface unbekannt ist da es ja im .jar File des Servers liegt.
Mein Verständnisproblem ist nun folgendes:
Klar kann ich das .jar File des Servers in den Klassenpfad des Clients legen nur bekomme ich dann eine Antwort aus genau dem jar? Ich möchte ja das ich die Antwort von meinem entfernten Server bekomme.
Hat jemand Erfahrungen mit Client Server Anwendungen bei denen der Serverteil auch auf einem physikalisch entfernten Rechner liegt?
Bin für jede Hilfe dankbar.
Gruß
Sunbird
Ich will eine Client-Server Anwendung mit RMI schreiben.
Um etwas genauer zu werden:
Der Server Teil soll auf einem eigens dafür angeschafften Server laufen während der Client auf unterschiedlichen Rechnern laufen wird.
Der Server soll vor allen Dingen Datenbank Querys in seinen lokalen Speicher schreiben. Die Datenbak beinhaltet sehr viele Datensätze die oft durchlaufen werden müssen um nach verschiedenen Werten zu schauen. In wie weit das funktioniert und der Speicher ausgelastet wird muss man dann mal schauen. Jedenfalls ist es absolut unpraktikabel wenn der Client jedes Mal ein eigenes Query absetzt und auf dessen Ergebnis warten müsste. Ich denke beim Server an 8GB RAM und hoffe das reicht aus. Es kommen nur einmal täglich neue Daten so das man das Rowset nur einmal am Tag füllen müsste.
Server und Client laufen NICHT auf dem gleichen Rechner. Ich hoffe das lässt sich mit RMI programmieren. Sonst müsste ich das ganze als Sockets selber schreiben.
Da ich aber vorher noch mit RMI gearbeitet habe möchte ich erstmal nur ein kleines Programm haben das einen einfachen String vom Server zurückgibt um die funktionsweise zu verstehen.
Server
Remote Interface
Java:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface TestService extends Remote{
public String greeting() throws RemoteException;
}
Remote Implementation
Java:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class TestServiceImpl extends UnicastRemoteObject implements TestService{
public TestServiceImpl() throws RemoteException{
}
@Override
public String greeting() throws RemoteException{
return "Dieser String wird vom Server geliefert";
}
}
Registry
Java:
import de.server.services.TestService;
import de.server.services.TestServiceImpl;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RemoteServer;
import java.rmi.server.UnicastRemoteObject;
public class Main {
public static void main(String[] args) throws RemoteException{
try{
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
TestServiceImpl greet = new TestServiceImpl();
TestService stub = (TestService)UnicastRemoteObject.exportObject(greet, 0);
RemoteServer.setLog(System.out);
Registry registry = LocateRegistry.getRegistry();
registry.rebind("TestService", stub);
System.out.println("TestService angemeldet");
}
catch(Exception e){
}
}
}
Das lässt sich kompilieren und erfolgreich starten durch aufruf des .jar Files.
Client
Ich möchte das der String nach dem betätigen eines jButtons in die Konsole geschrieben wird.
Java:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
try {
java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.getRegistry();
TestService greet = (TestService) registry.lookup("TestService");
System.out.println(greet.greeting());
}catch(Exception e){
}
}
Mein Verständnisproblem ist nun folgendes:
Klar kann ich das .jar File des Servers in den Klassenpfad des Clients legen nur bekomme ich dann eine Antwort aus genau dem jar? Ich möchte ja das ich die Antwort von meinem entfernten Server bekomme.
Hat jemand Erfahrungen mit Client Server Anwendungen bei denen der Serverteil auch auf einem physikalisch entfernten Rechner liegt?
Bin für jede Hilfe dankbar.
Gruß
Sunbird