Pagina documente » Informatica, Matematica » Prezentarea metodei RMI in limbajul Java

Cuprins

lucrare-licenta-prezentarea-metodei-rmi-in-limbajul-java
Aceasta lucrare poate fi descarcata doar daca ai statut PREMIUM si are scop consultativ. Pentru a descarca aceasta lucrare trebuie sa fii utilizator inregistrat.
lucrare-licenta-prezentarea-metodei-rmi-in-limbajul-java


Extras din document

CUPRINS
PARTEA I - PREZENTAREA PARTII TEORETICE A PROIECTULUI
1. Introducere...2
2. Un server RMI de date5
3. Amplasarea fisierelor de tip class............9
4. RMI - descrierea pachetelor....13
5. Interfata Remote........13
6. Clasa Naming.............15
7. Clasa LocateRegistry.19
8. Interfata Registry........21
9. Clasa RemoteObject..22
10. Clasa RemoteServer..24
11. Clasa UnicastRemoteObject....25
12. Clasa RemoteStub....28
13. Interfata Unreferenced.............28
14. Clasa RMISocketFactory.........29
PARTEA II - PREZENTAREA PARTII PRACTICE A PROIECTULUI
15.1 Tema proiectului......34
15.2 Definirea si implementarea serverului.......... ......34
15.3 Clasa Client..............45
15.4 Executia aplicatiei....60
1
2

Alte date

?

1. Introducere

Metoda RMI(remote method invocation), adica invocarea metodei de la distanta, furnizeaza stratul intermediar in retea care permite obiectelor Java rezidente pe masini virtuale diferite sa comunice folosind metodele obisnuite de apelare. Atat timp cat calculatoarele gazda pot sa comunice prin TCP/IP (de exemplu, calculatoare conectate la Internet), aplicatiile de retea pot fi dezvoltate fara streamuri(fluxuri de date) si socketuri(puncte de legatura).

Acest lucru permite programatorului sa evite protocolurile de comunicare complexe intre aplicatii si in schimb sa adopte un proiect de nivel mai inalt al metodei bazate.

Intregul scop al implementarii metodei RMI este sa furnizeze un cadru pentru obiectele Java, pentru a comunica prin metodele lor, fara a depinde de locul unde sunt situate. Aceasta inseamna ca un client ar trebui sa acceseze un server de pe masina locala sau de pe retea ca si cum ei ar fi in acelasi sistem in momentul executiei. Din punctul de vedere al programatorului, detaliul de retea necesar pentru aplicatiile distribuite dispare. Toate comunicarile de retea sunt executate in mod transparent, sub aparenta apelarilor standard ale metodei.

Pentru a crea o clasa care va fi accesibila de la distanta, definim mai intai o interfata care declara acele metode pe care noi dorim sa le facem publice. Parametrii si valorile returnate pot sa fie de orice tip; transferul de date este manipulat de streamurile(fluxurile de date) obiectelor in mod automat. Clasa trebuie sa puna in aplicare aceasta interfata, plus oricare alte interfete si metode de care ea are nevoie pentru folosirea ei in scopul propus.

O clasa stub si o clasa skeleton trebuiesc dupa aceea sa fie generate folosind comanda rmic, o unealta disponibila in JDK. Un stub este o clasa care in mod automat traduce apelari de la distanta ale metodei in parametrul trecator in configurarea comunicarii in retea . Un skeleton este clasa corespondenta care este rezidenta pe masina virtuala de la distanta si care accepta aceste conexiuni de retea si le traduce in apelari reale de metoda pe obiectul real.

Setarea finala implicata in folosirea RMI-ului este ca acel obiect de la distanta trebuie sa fie inregistrat cu un nume de serviciu care permite clientilor sa il localizeze in timp ce ruleaza. Clientul se conecteaza la numele registrului si solicita o referire despre un obiect care s-a inregistrat sub un nume de botez (ca de exemplu DateServer). Dupa aceea numele registrului intoarce o referire de la distanta despre obiectul inregistrat sub acel nume.

Sub arhitectura actuala RMI, aceasta referire include gazda unde obiectul ruleaza de la distanta, portul pe care el asculta si identificatorul obiectului intern RMI. Toate aceste detalii sunt oricum ascunse programatorului. Programatorul pur si simplu primeste o clasa stub care pune in aplicare interfetele necesare si in mod automat traduce apelarile de metoda in apelari de metoda de la distanta pe obiectul real.

Dupa ce clientul a obtinut o referire de la distanta, el poate sa inceapa sa invoce metodele de pe obiectul aflat la distanta. Cadrul RMI are grija de toate comunicarile de la cel mai jos nivel; clientul este capabil sa faca apelari de metoda pe obiectul aflat la distanta ca si cum ar face apelarile pe obiect local. Cadrul RMI chiar include si suportul pentru exceptiile de la distanta care sunt returnate pentru colectia de gunoi distribuita, pentru ca obiectele de la distanta sa nu fie stranse in gunoi in timp ce referirile de la distanta raman lor.

Urmarind apelarea metodei clientul pare sa invoce metoda de pe obiectul de la distanta direct. Apelarea este transferata stub-ului, care stapaneste toate detaliile despre configurarea comunicarii si transmite apelarea si parametrii la skeleton. Dupa aceea skeleton-ul transforma apelul de metoda de pe obiectul aflat la distanta. Valoarea returnata este trimisa in cele din urma inapoi de la skeleton la stub, ca si cum apelul de metoda ar fi fost facut local. Exceptii desigur sunt si ele returnate inapoi pe masura ce rezultate sunt corecte.

Daca obiectul de la distanta a fost configurat in mod corect, atunci toata aceasta munca este transparenta ambilor, adica la obiectului aflat la distanta si clientului. Acesta nu insemna ca acele obiecte pot fi transformate in obiecte aflate la distanta fara o cunoastere anterioara si sigura; interfetele specifice trebuie sa fie puse in aplicare si fisierele de clasa specifice trebuie sa fie generate. De asemenea nu insemna ca oricare metoda a obiectului de la distanta poate sa fie invocata; doar acele metode declarate in interfata de la distanta sunt accesibile clientilor. Oricum, tin^nd cont de aceste diferente, cadrul RMI este un mecanism extrem de puternic pentru ca el permite aplicatiilor de retea sa fie dezvoltate, ca si cum totul ar fi o apelare de metoda de la distanta.

1.1 Obiectul de la distanta

Un obiect de la distanta este oricare obiect care a fost setat sa accepte apelari de metoda de la un alt obiect care ruleaza pe o masina Java virtuala aflata la distanta. Acesta este format din doua parti: o interfata care descrie metodele obiectului si implementarea acestei interfete.

1.1.1Definirea interfetei de la distanta

O interfata trebuie sa fie scrisa pentru obiectul de la distanta definind toate metodele care ar trebui sa fie publice. Aceasta interfata trebuie sa extinda java.rmi.Remote, o clasa care pur si simplu identifica de la distanta interfetele accesibile.

De exemplu, pentru a scrie un obiect de la distanta cu o singura metoda, interfata poate arata astfel:

import java.rmi.Remote;

import java.rmi.RemoteException;

public interface MyRemote extends Remote

{

public int RemoteHash (String s) throws RemoteException;

T

In exemplul de mai sus, noi declaram o interfata, care poate sa fie implementata cu oricare obiect aflat la distanta si care declara o singura o metoda accesibila de la distanta, remoteHash(), care primeste un parametru de tip string si returneaza un parametru de tip int. Toate acele metode care sunt declarate intr-o interfata de la distanta trebuie sa fie declarate astfel inc^t ele sa genereze toate exceptiile de tipul java.rmi.RemoteException. O metoda poate, desigur, sa fie declarata ca ea sa poata sa genereze alte exceptii, depinz^nd de propria ei alegere.

1.1.2 Implementarea interfetei de la distanta

Implementarea obiectului de la distanta trebuie sa extinda java.rmi.server.RemoteObject sau o subclasa, si trebuie sa puna in aplicare fiecare din interfetele de la distanta pe care obiectul doreste sa le suporte. În realitate, java.rmi.server.Unicast.RemoteObject este cea mai acceptabila pentru a fi folosita ca supraclasa; aceasta clasa furnizeaza o implementare a comportarii tuturor obiectelor caracteristice de la distanta.

O implementare a interfetei de mai sus ar trebui sa arate astfel:

import java.rmi.*;

import java.rmi.server.*;

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote

{

public MyRemoteImpl () throws RemoteException {

T

public int remoteHash (String string)

{

return string.hashCode();

T

T