Visualizza articoli per tag: UDP

Java UDP

Pubblicato in Blog

User Datagram Protocol UDP è un protocollo di comunicazione che trasmette pacchetti indipendenti sulla rete senza alcuna garanzia di arrivo e senza ordine di consegna ( l’ordine di arrivo dei pacchetti non è necessariamente nello stesso ordine di partenza ), è un protocollo non affidabile.

In sintesi: UDP non è orientato alla connessione, lo streaming di dati tra due host non è stabile.

Un sistema client-server UDP in JAVA:


SERVER

import java.io.IOException;
import java.net.*;
import java.util.Date;

Per semplicità andremo ad estendere alla classe Server il metodo thread, in questo modo tutto il codice si troverà all'interno del metodo run

public class Server extends Thread {

Creiamo un DatagramSocket globale che useremo per inviare i nostri pacchetti, e due array di byte che ci serviranno per ricevere e spedire i nostri messaggi. Definiamo una variabile per la porta del server, e dichiariamo le due stringhe per il messaggio, in seguito verranno convertite in byte.

    private DatagramSocket socket;
    byte[] bufferIngresso = new byte[512];
    byte[] bufferUscita = new byte[512];
    int portaServer = 7777;
    String messaggioUscita;
    String messaggioIngresso;

Definiamo il tipo di socket, DatagramSocket, e gli assegnamo una porta.

public Server() throws SocketException {
        socket = new DatagramSocket(portaServer);
    }

Dichiariamo una variabile booleana per il ciclo while di ripetizione.

private boolean socketAttivo;

All'interno del metodo run inseriamo un ciclo while che verrà terminato quando la variabile socketAttivo assumerà valore false dovuto ad un errore o ad uno stop da parte del client.

    @Override
    public void run() {
        socketAttivo = true;

Nella parte superiore del ciclo, istanziamo un DatagramPacket per ricevere i messaggi in arrivo.

  while (socketAttivo) {
            DatagramPacket pacchetto = new DatagramPacket(bufferIngresso, bufferIngresso.length);

Chiamiamo il metodo receive sul socket. Questa chiamata blocca il socket che attende fino a quando arriva un messaggio, e lo passa all'interno della matrice di byte usando il DatagramPacket istanziato sopra.

  try {
                socket.receive(pacchetto);

Dopo aver ricevuto il messaggio, recuperiamo l'indirizzo e la porta del client, per inviare la risposta al mittente

   InetAddress client = pacchetto.getAddress();
                int porta = pacchetto.getPort();

Analizziamo il pacchetto costruendo un oggetto di tipo String che preleva la lunghezza del vettore con getLegth() a partire dalla posizione di offset a 0

      messaggioIngresso = new String(pacchetto.getData(), 0, pacchetto.getLength());

Inseriamo delle condizioni per rispondere al messaggio e eventualmente terminare la connessione

     if (messaggioIngresso.equals("DATA")) {
                    Date data = new Date();
                    messaggioUscita = data.toString();
                    bufferUscita = messaggioUscita.getBytes();
                } else if (messaggioIngresso.equals("STOP")) {
                    messaggioUscita = "server fermato";
                    bufferUscita = messaggioUscita.getBytes();
                    socketAttivo = false;
                } else {
                    messaggioUscita = "comando inatteso";
                    bufferUscita = messaggioUscita.getBytes();
                }

                DatagramPacket risposta = new DatagramPacket(bufferUscita, bufferUscita.length, client, porta);
                socket.send(risposta);
            } catch (IOException exception) {

            }

        }
        socket.close();
    }

    public static void main(String[] args) {
        int c;
        try {
            Server server = new Server();
            server.start();
            c = System.in.read();
            server.interrupt();
            server.join();
        } catch (Exception e) {
            System.out.println("errore!");
        }
    }
}
More
Sottoscrivi questo feed RSS

Questo sito utilizza cookie, per migliorare la tua esperienza e offrire servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all’uso dei cookie. Se vuoi saperne di più o negare il consenso a tutti o ad alcuni cookie vai alla sezione Cookie Policy.