# RMI Code Frage:



## mikeD (21. Dez 2011)

so habe hier eine anwendung.


hab sie natürlich großzügig beschnitten, dass nur die teile drin sind, die relevant sind:

es handelt sich um eine RMI anwendung die aus einem server und einem client besteht.

diese ist teil einer studienarbeit in der verschiedene transferprotokolle tcp/udp und diese rmi anwendung in der geschwindigkeit verglichen werden.

die aufgabe ist es ein datenpaket(in diesem fall ein objekt) vom typ echoPDU hin und her zu schicken.

dabei musste man ein paar test, RTT etc machen.

der server erstellt die registery lokal, named das objekt RMIServer und der client sucht dannach und ruft die methode ECHO auf. und genau jetzt kommt mein problem.

mir gehts jetzt speziell um die methode ECHO in der server implementierung.

was macht die genau? in der tcp/udp version haben wir entweder datenströme oder datagramm pakete rumgeschickt. was passiert jetzt bei rmi ?

vielen dank schonmal


SERVER:



```
public class RMIEchoServer
{	
	public static void main (String args[])
   	{
		PropertyConfigurator.configureAndWatch("log4j.server.properties", 60 * 1000);
		Registry rmiRegistry = null;
		 {
			    try {
			    	
			      LocateRegistry.createRegistry(1099);
			      // RMI START: Registery wird LOKAL angelegt	    
	   		    Naming.rebind("RMIServer", new RMIEchoServerImpl());
```

CLIENT:


```
//der Client sucht in der REGISTRY nach unserem Server (RMIServer) 
						echoServer = (RMIEchoServerInterface)Naming.lookup("rmi://"+ "192.168.0.103" + ":" + 1099 + "/RMIServer");
					//	echoServer = (RMIEchoServerInterface)Naming.lookup("rmi://"+ "127.0.0.1" + ":" + 1099 + "/RMIServer");
						
					} catch (RemoteException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (NotBoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (MalformedURLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
				}
public void run() 
{   
for (int i = 0; i < numberOfMessages; i++) 
{
	//RTT Daten werden ermittelt, nachricht wird erzeugt(nachrichtenlänge festgelegt), Name eingestellt, 
	rttStartTime = System.nanoTime();
	sharedData.incrSentMsgCounter(numberOfClient);
	EchoPDU test1 = new EchoPDU();
//	test1.setClientName(Thread.currentThread().getName());
	test1.setMessage(test1.neueNachricht(messageLength));
	rtt = System.nanoTime() - rttStartTime;
	sharedData.incrReceivedMsgCounter(numberOfClient, rtt, test1.getServerTime());
```



dann noch relevant ist die server implementierung:


```
public RMIEchoServerImpl() throws RemoteException 
	{	
	}
	
	public EchoPDU echo(EchoPDU message) throws RemoteException 
	{	
		//RTT Daten werden gesammelt, EchoPDU verarbeitet
   	    long startTime = System.nanoTime();
   	    EchoPDU sendPdu = null;	
   	    sendPdu = message;
//   	message.setClientName(Thread.currentThread().getName());	
   	    startTime = System.nanoTime() - startTime;
   	    sendPdu.setServerTime(startTime);
	   	return sendPdu;  
	}
```


----------



## nillehammer (21. Dez 2011)

Der Charme an RMI ist, dass Du Dir eine Instanz Deiner Klassen holen kannst und darauf ganz normal Methoden aufrufen. Du als Programmierer musst Dich nicht um Serialisieren/Deserialisieren, Streams, ServerSockets etc. kümmern. Das passiert alles automatisch.


----------



## mikeD (21. Dez 2011)

ja gut okay. aber die frage ist jetzt immernoch.

in dem (nicht geposteten) tcp/udp teil "fliegen" datenströme oder datasocket packete rum.

was "fliegt" den jetzt bei RMI rum ?

die objekte?


----------



## nillehammer (22. Dez 2011)

Ja, es fliegen serialisierte Javaobjekte rum.


----------



## tuxedo (24. Dez 2011)

+ noch ein wenig RMI Protokoll oben drauf...


----------

