|
|||||||||||||||||||||||||||||||||
Nonostante che l’importanza di Java stia crescendo e che l’ interesse nei confronti del Networking sia sempre maggiore, la programmazione di rete in Java è ancora per molti aspetti oscura. Eppure è molto semplice, in questo articolo ci concentreremo su tutto ciò che ha che fare con il protocollo UDP e le classi Java |
|||||||||||||||||||||||||||||||||
Introduzione
Spesso si preferisce ancora scrivere applicazioni di questo tipo ancora in C/C++ (e in alcuni casi limitati, questo è effettivamente consigliabile) ma si può farlo benissimo anche in Java ed è più facile e veloce. Per affrontare questo articolo, non è necessario essere specialisti della rete, una conoscenza dei concetti basilari della rete è comunque richiesta, dato che si farà riferimento ai termini più comuni che si incontrano quando ci si avventura in questa branca della programmazione. Cominciamo con una note dolente : la rete è l’area meno supportata dalla maggior parte delle implementazioni Java, non ci sono errori rilevanti relativi al Networking ma, se si può scegliere l’implementazione è quindi la piattaforma, è meglio optare per quella della Sun per Solaris. A questo punto il lettore potrebbe, assalito da qualche dubbio, chiedersi perché dovrebbe avventurasi nella programmazione di rete in Java .Basta dare uno sguardo alla lista delle classi che il linguaggio offre per trattare problematiche di rete per rispondere a questa domanda. Java (in particolare il package java.net) fornisce delle ottime astrazioni alle problematiche di rete e non bisogna essere dei guru della rete. Attenzione però, Java attualmente conosce le reti basate su sistemi IP, quindi altre (minori) architetture rimangono fuori ma non è assolutamente un problema, dato che ormai IP oltre a essere lo standard di Internet (quello con la I maiuscola, la grande rete) sta ormai per divenire anche quello delle piccole internet aziendali. In rete i dati viaggiano per mezzo di pacchetti chiamati datagram. Nelle reti IP ogni datagramma contiene un intestazione lunga dai 20byte ai 60 byte ed un insieme di dati che contiene fino a 65.515byte. L’User Datagram
Protocol ovvero UDP
La
testata UDP e' relativamente semplice.
User Datagram
Header Format
Casi d’uso del
protocollo UDP
Ed è gia
UDP
Finalmente un
po’ di codice!
private
DatagramSocket serverSocket ;
Ora
che abbiamo il nostro oggetto socket per l’UDP (notare che si utilizza
per questa ragione un DatagramSocket)
serverSocket.setSoTimeout(5000) ; Adesso
supponiamo di voler spedire un segnale al nostro dispositivo (ad esempio
il classico segnale di inizializzazione) per fare questo dobbiamo costruire
un oggetto di tipo DatagramPacket
DatagramPacket(byte[]
buf, int length, InetAddress address, int port)
Quindi inviamolo al nostro dispositivo serverSocket.send(packet); A questo punto, direi che la prossima cosa da fare è aspettare il segnale di ritorno dal nostro dispositivo, che dovrebbe essere un echo nel migliore dei casi, un messaggio di errore o altro, dipende dal dispositivo e dell’ architettura del sistema scelto permettendo. Creiamo il DatagramPacket vuoto che conterrà il pacchetto ritornato, ricordandoci che il protocollo UDP non è sicuro, e quindi spetta a noi (qualora sia possibile, e non sempre lo è…) gestire a livello software un eventuale sistema di controllo degli errori. DatagramPacket
packet =
Per metterci in ascolto sul socket utilizziamo il metodo receice, che è bloccante, cioè blocca il flusso del programma finché non riceve un pacchetto o scade il timeout, sollevando un eccezione.
try{
Infine è sempre buona norma rimettere le cose al loro posto prima di chiudere l’applicazione, che tradotto significa che dobbiamo chiudere il socket con il metodo close. serverSocket.close() ; Abbiamo visto come sia relativamente facile lavorare con UDP e Java, ben inteso l’argomento è ben più esteso, ma al contrario del più diffuso e sicuro TCP/IP, bisogna tagliare le soluzioni su misura, di caso in caso, con un occhio di riguardo ai dispositivi con cui si deve colloquiare.Infatti essi dettano le regole del gioco e lo fanno a proprio vantaggio, o meglio questo è quello che fanno i loro costruttori. Un
ultima nota prima di passare all’approfondimento : cercate di non disseminare
di oggetti DatagramPacket le vostre applicazioni, progettate sempre classi
wrapper, vi renderà molto più facile la vita quando dovrete
fare i conti con qualche classe deprecata o qualche baco della liberia….,
inoltre fate sempre dei test conoscitivi in modo da sapere prima
come si comporta la vostra implementazione di UDP su sistemi operativi
diversi come NT, quando ad esempio la JVM va in crash ma il socket non
ne vuole sapere di chiudersi e altre sorpresine di mamma Sun.
L’approfondimento
public DatagramPacket(byte[] buff, int len) in questo caso i dati si troveranno in buff public DatagramPacket(byte[] buff, int len, InetAddress addr, int port) in
quest’ altro si crea un datagramma per inviare il pacchetto di byte buff
all’ host di indirizzo addr e alla porta port
public
synchronized InetAddress getAddress()
La classe DatagramSocket invece serve per inviare o ricevere un datagramma, anche qui troviamo diversi costruttori : public DatagramSocket() throws SocketException legato ad una porta anonima, in quanto la porta di destinazione è parte del DatagramPacket. public
DatagramSocket(int port) throws SocketException
vi sono poi i metodi : public
void send(DatagramPacket o) throws IOException
che
ovviamente libera la porta occupata da quel socket
public synchronized void setSoTimeout(int timeout) throws SocketException e per conoscerne il valore public
synchronized int getSoTimeout() throws IOException
Conclusione
|
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|