programmare con le socket tcp in javacmp/corsoreti/slides05/lab/sockets-java.pdf · gli stream...

21
Programmare con le Socket TCP in java 2: Application Layer 1

Upload: others

Post on 25-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

Programmare con le Socket TCPin java

2: Application Layer 1

Page 2: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 3: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 4: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 5: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 6: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 7: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 8: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 9: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 10: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 11: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le 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

Page 12: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 13: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 14: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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);

}

Page 15: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 16: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 17: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 18: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 19: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 20: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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

Page 21: Programmare con le Socket TCP in javacmp/CorsoReti/slides05/lab/sockets-java.pdf · Gli Stream delle socket TCP Quando due processi hanno stabilito una connessione TCP usando le socket,

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