IL PACKAGE java.net

Questo package definisce fondamentalmente:

più una serie di classi correlate:

 

I/O VIA SOCKET

Le socket sono associate a un InputStream e a un OutputStream: quindi, per scrivere e leggere si usano le normali primitive previste per gli stream.

È anche possibile incapsulare tali stream in stream più sofisticati, come ampiamente discusso a proposito del package di I/O.

 

 

ESEMPIO - Apertura di un URL specificato

La classe URL è la base per creare connessioni HTTP.

Qui ci si connette all’URL dato e si visualizza ciò che viene inviato dal server (nell’ipotesi che si tratti di testo).

 

import java.io.*; import java.net.*;

class EsempioURL {

public static void main(String args[]){

String indirizzo = "file:///autoexec.bat";

URL u = null;

try { u = new URL(indirizzo);
  System.out.println("URL aperto: " + u);
}
catch (MalformedURLException e) {
  System.out.println("URL errato: " + u);
}

URLConnection c = null;
DataInputStream istream = null;

try {

System.out.print("Connessione in corso...");
c = u.openConnection();
c.connect();
System.out.println("ok.");

BufferedInputStream b = new
BufferedInputStream(c.getInputStream());

istream = new DataInputStream(b);

System.out.println("Lettura dei dati...");

String s;
while( (s = istream.readLine()) != null )
System.out.println(s);

}

catch (IOException e) {
  System.out.println(e.getMessage());
}

 }

}

 

ESEMPIO 1 - Una mini-applicazione client / server

Il client si limita a visualizzare tutto quello che gli è arriva dal server, fino a che non riceve il messaggio "Stop".

Il server assegna un numero progressivo, a partire da 1, a ogni client che si connette.

 

// IL CLIENT 1

// Ipotesi: server port (fisso) = 11111

import java.io.*; import java.net.*;

class Client1 {

public static void main(String args[]){

Socket s = null;
DataInputStream is = null;

try {
  s = new Socket("localhost", 11111);
  is = new DataInputStream(s.getInputStream());
}
catch (IOException e) {
  System.out.println(e.getMessage());
  System.exit(1);
}
System.out.println("Socket creata: " + s);

try {

String line;
while( (line=is.readLine())!=null ) {
  System.out.println("Ricevuto: " + line);
  if (line.equals("Stop")) break;
}
is.close(); // chiusura stream
s.close(); // chiusura socket

}
catch (IOException e) {
  System.out.println(e.getMessage());
}

  }

}


// IL SERVER 1

import java.io.*; import java.net.*;

class Server1 {

public static void main(String args[]){

ServerSocket serverSock = null;
Socket cs = null;
int numero = 1;
System.out.print("Creazione ServerSocket...");

try {
  serverSock = new ServerSocket(11111);
}
catch (IOException e) {
  System.err.println(e.getMessage());
  System.exit(1);
}

while (numero<3) { // condizione arbitraria

System.out.print("Attesa connessione...");

try { cs = serverSock.accept(); }
catch (IOException e) {
  System.err.println("Connessione fallita");
  System.exit(2);
}

System.out.println("Conness. da " + clSock);

try {
  BufferedOutputStream b = new
  BufferedOutputStream(cs.getOutputStream());
  PrintStream os = new PrintStream(b,false);
  os.println("Nuovo numero: " + numero);
  numero++;
  os.println("Stop"); os.close();
  cs.close();
}
catch (Exception e) {
  System.out.println("Errore: " +e);
  System.exit(3);
}

}

}

}

 

ESEMPIO 2 - Una mini-calcolatrice client / server

Il client invia al server una serie di righe di testo, contenenti numeri interi (uno per riga); l’ultima riga contiene lo zero.

Il server effettua la somma dei valori ricevuti e la ritrasmette al client; una riga contenente il valore 0 indica fine sequenza.

 

// IL CLIENT 2

import java.io.*; import java.net.*;

class Client2 {

public static void main(String args[]){

Socket c = null;
DataInputStream is = null;
PrintStream os = null;

try {
  c = new Socket("localhost", 11111);
  is = new DataInputStream(c.getInputStream());
  os = new PrintStream(new
BufferedOutputStream(c.getOutputStream()));
} catch (IOException e) {
  System.err.println(e.getMessage());
  System.exit(1);
}

System.out.println("Socket creata: " + c);

// invio valori al server (da linea comandi)

for (int i=0; i<args.length; i++) {
  System.out.println("Sending " + args[i]);
  os.println(args[i]);
}
os.println("0"); os.flush();

System.out.println("Attesa risposta...");
String line = null;
try {
  line = new String(is.readLine());
  is.close(); os.close(); s.close();
} catch (IOException e) {
  System.err.println(e.getMessage());
}

System.out.println("Msg dal server: " + line);

}

}


// IL SERVER 2

import java.io.*; import java.net.*;

class Server2 {

public static void main(String args[]){

ServerSocket serverSock = null;
Socket cs = null;

System.err.println("Creazione ServerSocket");
try {
  serverSock = new ServerSocket(11111);
}
catch (IOException e) {
  System.err.println(e.getMessage());
  System.exit(1);
}

while (true) {
  System.out.println("Attesa connessione...");
  try {
    cs = serverSock.accept();
  }
  catch (IOException e) {
    System.out.println("Connessione fallita");
    System.exit(2);
  }

  System.out.println("Connessione da " + cs);

  try {
    BufferedInputStream ib = new
      BufferedInputStream(cs.getInputStream());
    DataInputStream is = new DataInputStream(b);
    BufferedOutputStream ob = new

      BufferedOutputStream(cs.getOutputStream());
    PrintStream os = new PrintStream(ob,false);

    String line; int y, x = 0;
    do {
      line = new String(is.readLine());
      y = Integer.parseInt(line);
      System.out.println("Value: " + y);
      x += y;
    } while (y!=0);

    os.println("Somma = " + x); os.flush();
    os.close(); is.close(); cs.close();

  }
  catch (Exception e) {
    System.out.println("Errore: " +e);
    System.exit(3);
  }

   }
  }
}

 

ESEMPIO 3 - Un mini-FTP

Il client invia al server il nome di un file (di testo), preso dalla riga di comando.

Il server risponde spedendo al client il contenuto, riga per riga, di tale file. Sono gestite le situazioni particolari (file not found, etc.)

 

// IL CLIENT 3

import java.io.*; import java.net.*;

class Client3 {

public static void main(String args[]){

Socket s = null;
DataInputStream is = null;
PrintStream os = null;

try {
  s = new Socket("localhost", 11111);
  is = new DataInputStream(s.getInputStream());
  os = new PrintStream(new
BufferedOutputStream(s.getOutputStream()));
}
catch (IOException e) {
  System.err.println(e.getMessage());
  System.exit(1);
}
System.out.println("Socket creata: " + s);

// --- controllo argomenti

if (args.length==0) {
  os.println("Missing file name");
  os.flush(); os.close();
  try {
    is.close(); s.close();
  }
  catch (IOException e) {
    System.out.println(e.getMessage());
  }
  System.exit(1);
}

// --- invio messaggio

System.out.println("Sending " + args[0]);
os.println(args[0]); os.flush();

// --- stampa risposta del server

System.out.println("Attesa risposta...");
String line = null;
try {
  while ((line = is.readLine()) != null) {
    System.out.println("Messaggio: " + line);
  }
  is.close(); os.close(); s.close();
}
catch (IOException e) {
  System.out.println(e.getMessage());
}

 }

}


Il server

Il server risponde spedendo al client il contenuto, riga per riga, di tale file. Sono gestite le situazioni particolari (file not found, etc.)

import java.io.*; import java.net.*;

class Server3 {

public static void main(String args[]){

ServerSocket serverSock = null;
Socket c = null;
System.err.println("Creazione ServerSocket");

try {
  serverSock = new ServerSocket(11111);
}
catch (IOException e) {
  System.out.println(e.getMessage());
  System.exit(1);
}

while (true) {
  System.out.println("Attesa connessione...");
  try {
    c = serverSock.accept();
  }
  catch (IOException e) {
    System.out.println("Connessione fallita");
    System.exit(2);
  }

  System.out.println("Connessione da " + c);

  // --- inizio colloquio col client

  DataInputStream is = null;
  PrintStream os = null;
  try {
    BufferedInputStream ib = new
      BufferedInputStream(cs.getInputStream());
    is = new DataInputStream(ib);
    BufferedOutputStream ob = new
      BufferedOutputStream(c.getOutputStream());
    os = new PrintStream(ob,false);

    // --- ricezione nome file dal client

    String n = new String(is.readLine());
    System.out.println("File: " + n);

    // --- controllo esistenza file

    if (n.equals("Missing file name")) {
      os.flush();os.close();is.close();c.close();
    }

    // --- invio del file al client

    DataInputStream is = new
      DataInputStream(new FileInputStream(n));
    String r = null;

    while ((r = is.readLine())!=null) {
      os.println(r);
    }
    os.flush();os.close();is.close();cs.close();
  }
  catch (FileNotFoundException e) {
    System.out.println("File non trovato");
    os.println("File non trovato");
    os.flush(); os.close();
  }
  catch (Exception e) {
    System.out.println(e);
  }

   }

  }

}