programmare con le socket tcp in javacmp/corsoreti/slides05/lab/sockets-java.pdf · gli stream...
TRANSCRIPT
Programmare con le Socket TCPin java
2: Application Layer 1
Il Client contatta il serverIl Server:
Il processo server è sempre attivo in attesa di connessioni (demone)Crea una socket per accettare la connessione del client (“socket di benvenuto”, java.net.ServerSocket)
Il Client:Crea una socket TCP locale, specificando l’indirizzo IP e numero di porta del processo serverQuando il client crea la socket: il lato client TCP stabilisce una connessione con il server TCP (connessione implicita nel costruttore di java.net.Socket)
2: Application Layer 2
Il server riceve una connessioneQuando viene contattato dal client, il TCP nel server crea una nuova socket per far comunicare il processo server con il nuovo client
Un server può interagire con molti client contemporaneamenteIl TCP usa il numero di porta sorgente per distinguere i pacchetti di diverse connessioni attive (insieme all’indirizzo IP)
Dal punto di vista dell’applicazione TCP fornisce un trasferimento di byte (un “tubo”) affidabile e ordinato tra le socket aperte dai processi client e serverDopo che è stata stabilita la connessione, le socket usate dal client e dal server sono equivalenti:
Possono inviare e ricevere datiUn protocollo applicativo governa l’ordine in cui parlano
2: Application Layer 3
Gli Stream - gergoUno stream (flusso) è una sequenza di caratteri che fluisce verso un processo o da un processoUn input stream è collegato a qualche sorgente di input del processo, come la tastiera, un file o una socket.Un output stream è collegato a qualche destinazione di output, come il monitor, un file o una socket.
2: Application Layer 4
Socket in javaPackage java.net
Classe java.net.Socketun canale di comunicazione verso un processo remotoCostruttoreSocket(InetAddress address, int port)
costruisce una Socket e crea una connessione al server address,port (usata dal client)Classe java.net.ServerSocketun punto di accesso ad un server per nuove connessioniCostruttoreServerSocket(int port)
crea una ServerSocket in attesa su una determinata porta TCPMetodoSocket java.net.ServerSocket.accept()si mette in attesa di connessioni, quando ne riceve una restituisce la relativa Socket (usata dal server). È un metodo bloccante.
2: Application Layer 5
Socket e stream
Una volta stabilita la connessione, client e server usano entrambi un oggetto di tipo SocketMetodoInputStream java.net.Socket.getInputStream() restituisce il flusso per leggere i dati provenienti dalla
SocketMetodoOutputStream java.net.Socket.getOutputStream() restituisce il flusso per inviare i dati verso la Socket
Metodojava.net.Socket.Close()
chiude la connessione TCP
2: Application Layer 6
Gli Stream delle socket TCPQuando due processi hanno stabilito una connessione TCP usando le socket, l’input stream della socket nel processo A è collegato all’output stream della socket corrispondente nel processo B, e viceversasi realizza un canale di comunicazione interprocesso remoto
Processo A Processo B
outToB
inFromB
Sock
etinput
stream
outputstream
outToA
inFromA
SocketTCP
socket
inputstream
outputstream
TCPsocket
input
IP network
2: Application Layer 7
Programmazione con le socket TCPtastiera terminale
Esempio di applicazione client-server:
1) Il client legge una riga dallo reads standard input (stream inFromUser), e la manda al server usando la socket (stream outToServer )
2) Il server legge la riga dalla socket
3) Il server converte la riga in caratteri maiuscoli, e la rimanda indietro al client
4) Il client legge dalla socket (stream inFromServer ) la riga modificata, e la stampa
client TCP socket
outToServe
to network from network
inFromServe
inFromUse
Processo Client
clientSocke
inputstream
inputstream
outputstream
TCPsocket
2: Application Layer 8
Interazione Client/server con le socket : TCP
chiudeconnectionSocket chiude
clientSocket
Attende richieste di connessione in ingressoconnectionSocket =welcomeSocket.accept()
Crea una socket, port=x, per le richieste in arrivo, e aspetta
welcomeSocket = ServerSocket(x)
Server (in esecuzione su hostid)
Crea una socket,Connessa a hostid, port=xclientSocket = Socket(hostid, port)
Client
Invia la richiesta usandoclientSocketLegge la richiesta da
connectionSocket
Scrive la risposta suconnectionSocket
Legge la risposta da clientSocket
TCP connection setup
2: Application Layer 9
Esempio: Java client (TCP)
2: Application Layer 10
import java.io.*; import java.net.*; class TCPClient {
public static void main(String argv[]) throws Exception {
String sentence; String modifiedSentence;
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("hostname", 6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
Crea uninput stream
Crea la socket client,
Connessa al serverCrea un
output streamConnesso
alla socket
Esempio: Java client (TCP), cont.
BufferedReader inFromServer = new BufferedReader(newInputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
clientSocket.close();
} }
Crea uninput stream
Connesso alla socket
Manda una rigaal server
Legge una rigadal server
2: Application Layer 11
Esempio: Java server (TCP)import java.io.*; import java.net.*;
class TCPServer {
public static void main(String argv[]) throws Exception {
String clientSentence; String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(newInputStreamReader(connectionSocket.getInputStream()));
Crea unasocket di benvenuto
Sulla porta 6789
Aspetta sulla socket di benvenuto il contatto del client
Crea un input stream,
connesso alla socket
2: Application Layer 12
Esempio: Java server (TCP), cont
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence); }
} }
Legge una rigadalla socket
Crea un outputstream, connesso
alla socket
Scrive una riga sulla socket
Fine del loop whileTorna all’inizio in attesadi una nuova connessione
2: Application Layer 13
gestione delle eccezioni TCPSe non è possibile effettuare una connessione TCP, il TCP informa l’applicazione che la ha richiesta generando una eccezione, che interrompe il flusso dell’esecuzione se non viene catturataUna eccezione è un oggetto appartenente ad una sottoclasse di java.lang.Exception
Le istruzioni nel blocco try possono generare eccezioni, che vengono gestite nel blocco catch appropriato per il tipo dell’eccezioneUna connessione fallita viene segnalata con una java.net.ConnectException
2: Application Layer 14
try {
clientSocket = new Socket(argv[0], 6789);
}
catch (java.net.ConnectException e){
System.out.println("connection failed:\n" + e);
}
Programmazione con le socket UDP
UDP: non c’è connessione tra client e serverNon è necessario stabilire la connessioneIl mittente inserisce esplicitamente l’indirizzo IP e la porta della destinazione in ogni pacchettoIl server deve estrarre l’indirizzo IP e la porta del mittente dal pacchetto ricevuto
UDP: i dati ricevuti possono essere persi o ricevuti fuori ordine
Punto di vista dell’applicazione:
UDP fornisce un trasferimento non affidabile di gruppi di byte (“datagrammi”) tra client e server
2: Application Layer 15
Interazione Client/server con le socket: UDP
chiudeclientSocket
Server (in esecuzione su hostid)
Legge la risposta daclientSocket
Crea una socket,clientSocket = DatagramSocket()
Client
Crea, indirizza (hostid, port=x)Invia il datagramma di richiestausando clientSocket
Crea una socket,port=x, per le richiestein arrivo:serverSocket = DatagramSocket(x)
Legge le richieste daserverSocket
Scrive le risposte suserverSocketSpecificando indirizzo IPe porta del client
2: Application Layer 16
Esempio: Java client (UDP)
send
Pac
ket
to network from network
rece
iveP
acke
t
inFr
omU
ser
keyboard monitor
Process
clientSocket
UDPpacket
inputstream
UDPpacket
UDPsocket
Output: invia un pacchetto (TCP mandava un “flusso di byte”)
Input: riceve un pacchetto (TCP riceveva un “flusso di byte”)
Clientprocess
client UDP socket
2: Application Layer 17
Esempio: Java client (UDP)
import java.io.*; import java.net.*;
class UDPClient { public static void main(String args[]) throws Exception {
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("hostname");
byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
Crea uninput stream
Crea la client socket
Traduce hostnamein un indirizzo IP
usando il DNS
2: Application Layer 18
Esempio : Java client (UDP), cont.
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); }
}
Crea un datagramma con i dati,lunghezza,
indirizzo IP, portaInvia il datagramma
to server
Legge ildatagramma
dal server
2: Application Layer 19
Esempio : Java server (UDP)
2: Application Layer 20
import java.io.*; import java.net.*;
class UDPServer { public static void main(String args[]) throws Exception
{
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024];
while(true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
Crea una socketdatagramma
Sulla porta 9876
Crea spazioper il datagramma
ricevutoRieceve il
datagramma
Esempio : Java server (UDP), cont
2: Application Layer 21
String sentence = new String(receivePacket.getData());
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
String capitalizedSentence = sentence.toUpperCase();
sendData = capitalizedSentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress,
port);
serverSocket.send(sendPacket); }
}
}
Determina indirizzo IP e
porta del mittente
Scrive ildatagrammaSulla socket
Fine del loop whiletorna all’inizio e attendi un altro datagramma
Crea un datagrammada mandare
al client