Newsgroup: it.comp.java
Titolo: Java e RMI

Salve a tutti,
ho un dubbio e vorrei chiarirmelo prima di iniziare a sviluppare.
Ho la necessità di fornire, tramite un server, delle funzioni a più client 
(su una architettura client-server).
Per fare questo voglio utilizzare il package RMI.
Il mio dubbio riguarda la porta rmi utilizzata dal server.
Che succede se più client accedono contemporaneamente al server? La porta 
rmi è solo una, e mi chiedo se i client si accodano o vengono reindirizzati 
su altre porte (come avviene con Telnet)
Insomma mi è assolutamente oscura la meccanica dei collegamenti e su 
internet (Sun compresa) non ho trovoato granchè.
Spero di essere stato sufficentemente chiaro.
Ciao,
Carlo



Dovrebbe essere una porta unica
tramite collegamento socket normale via TCP
.. dovrebbe ..
Nicola
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 .. dovrebbe ..
Mi auguro che tu stia sbagliando.
E se fosse veramente cosě come si puň reindirizzare il collegamento su 
un'altra porta, in modo tale da liberare la porta principale in favore di 
altri client?
Ciao. 

Ciao CC.
Quando ti connetti ad un server RMI lo fai sulla porta standard 1099.
Il servizio ad essa collegato è un rmiregistry ovvero un registro stile 
jndi che ti restituisce un ref remoto.
La connessione avviene secondo client-server tradizionale su una porta 
random scelta dal server (in realtà avviene sulla porta zero che in rmi 
significa random).
Per evitare la porta random puoi creare tu un'implementazione 
ServerSocket per l'oggetto RMI.
Spero di esserti stato d'aiuto.
Ciao,
kimbuba.


 significa random).
Quindi se ho capito bene la connessione iniziale avviene sulla porta 1099 e 
poi viene reindirizzata su una porta random ?!?
Grazie.
Carlo 

 
non so come funzioni il meccanismo client/server RMI ma se funziona come di
solito si fanno i server basati su TCP allora il client effettua la
connessione sulla porta X. Il server accetta la connessione aprendo
un'altra socket sempre sulla porta X e dialoga col client. Nel frattempo
l'originale socket sulla porta X rimane a disposizione per un nuovo client.
Ci pensa lo stack TCP a mandare i pacchetti di un client alla giusta socket
"X", direi in base alla coppia (indirizzo,porta) del client stesso (e'
l'unica informazione discriminatoria che c'e' nei pacchetti TCP...).
Se poi RMI come protocollo prevede l'apertura di una nuova connessione
verso una nuova porta.... non lo so ma francamente mi sembra dispendioso e
lento.
ciao
-- 
Seti@Home Java Applets
http://mrk.webhop.net/

Si questa dovrebbe essere l'implementazione standard sun.
Sulla porta reindirizzata però non è detto che non venga usata da più 
skeletons.
Per selezionare una porta fissa devi reimplementare la serversocket 
utilizzata dall'oggetto da esportare.
Attenzione che devi implementare anche equals, infatti rmi per 
riutilizzare la stessa porta per più servers li deve considerare uguali 
in server socket altrimenti assume che ci siano due protocolli diversi.
Ciao,
kimbuba.


 su altre porte (come avviene con Telnet)
Un oggetto x essere ritrovato in un sistema deve essere registrato da
qualche parte.
Nella tecnologia Java RMI è il registry che si occupa della gestione dei
nomi.
Il registry lo puoi lanciare da dentro una classe (es. la classe server)
oppure dal prompt dei comandi, ad esempio da un batch per semplificare le
cose.
Di default parte sulla porta 1099, ma nulla ti vieta di specificarne altre..
Puoi anche lanciare più registry (Se hai la necessità di robustezza del
sistema se cade il server che aveva lanciato il registry eventuali server
ridondanti non possono più ritrovare gli oggetti remoti).
Una volta che il registry è partito ogni classe per essere ritrovata si deve
registrare sul registry (con bind() o rebind() ) e chi sta cercando il
servizio registrato lo fa con la namingLookup().
La porta del registry è la porta di ascolto, così come succede nei sever
http, l'effettiva connessione avviene poi su un'altra porta.
Un'ultima cosa, potrebbe essere necessario non solo che il client esegua
procedure remote sul server, ma anche il contrario, in questo caso entrambi
si devono registrare ed entrambi devo fare la namingLookup().
Spero di essere stato d'aiuto.