Lab1 Socket
Lab1 Socket
Lab1 Socket
Gabriele Civitarese
[email protected]
EveryWare Lab
Universit`
a degli Studi di Milano
-
Docente: Claudio Bettini
Slide realizzate a partire da versioni precedenti di Letizia Bertolaja, Sergio Mascetti, Dario Freni e Claudio Bettini
Some slides for this course are partly adapted from the ones distributed by the publisher of the reference book for
this course (Distributed Systems: Principles and Paradigms, A. S. Tanenbaum, M. Van Steen, Prentice Hall, 2007).
All the other slides are from the teacher of this course. All the material is subject to copyright and cannot be
redistributed without consent of the copyright holder. The same holds for audio and video-recordings of the classes
of this course.
Lezioni teoriche
1a lezione:
Socket in Java
Sviluppo client-server (server iterativi/concorrenti)
2a lezione:
Sincronizzazione
Segnalazione
3a lezione:
Server REST
Puntatori a tool moderni per sviluppo sistemi distribuiti
Presentazione del progetto
Server
Client crea una listening socket
specificando una porta di
crea una socket specificando servizio
indirizzo del destinatario e
porta del servizio allarrivo di una connessione
in entrata, viene creata una
stabilita la connessione, la nuova established socket
established socket creata
viene utilizzata come la comunicazione avviene
interfaccia di comunicazione mediante la established
socket del server e quella
del client
java.net.Socket
java.net.ServerSocket
java.net.DatagramSocket
java.net.DatagramPacket
java.net.MulticastSocket
java.net.InetAddress
java.net.URL
java.net.URLConnection
java.net.URLEncoder
java.net.HttpURLConnection
Alcuni costruttori
Socket(InetAddress, int) // connects to the address and port
Socket(String, int) // connects to the named host and port
Socket(InetAddress, int, InetAddress, int) // can specify local port
Alcuni metodi
getInputStream() // returns an InputStream for the socket
getOutputStream() // returns an OutputStream for the socket
getInetAddress() // return the remote address
getPort() // return the remote port
Alcuni costruttori
ServerSocket(int) // create a server socket on a specified port
ServerSocket(int, int) // can specify backlog length
Alcuni metodi
accept() // listen for a connection, blocked until connection is made
getInetAddress() // returns the local address
Connessione a un passo
// t r a m i t e hostname
Socket s = new Socket( " e w s e r v e r . d i . u n i m i . i t ", 80);
// t r a m i t e i n d i r i z z o IP
Socket s = new Socket( " 1 5 9 . 1 4 9 . 1 4 5 . 2 0 0 ",80);
Uso di connect()
Listening
TCPClient.java
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(String argv[]) throws Exception {
String sentence;
String modifiedSentence;
TCPClient.java(2)
/* Inizializza lo stream di input dalla socket */
BufferedReader inFromServer =
new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
clientSocket.close();
}
}
TCPServer.java
import java.io.*;
import java.net.*;
class TCPServer {
while(true) {
/*
* Viene chiamata accept (bloccante).
* Allarrivo di una nuova connessione crea una nuova
* "established socket"
*/
Socket connectionSocket = welcomeSocket.accept();
TCPServer.java(2)
/* Inizializza lo stream di input dalla socket */
BufferedReader inFromClient =
new BufferedReader(new
InputStreamReader(connectionSocket.getInputStream()));
}
}
}
Client Server
crea una datagram socket crea una datagram socket
specificando una porta di ascolto
prepara un pacchetto attende un pacchetto in entrata
datagram contenente dal client sulla datagram socket
indirizzo server e porta di estrae indirizzo e porta del client
destinazione mittente dal pacchetto in entrata
prepara un pacchetto datagram di
invia il pacchetto attraverso risposta specificando indirizzo
la datagram socket client e porta di destinazione
invia il pacchetto attraverso la
attende il pacchetto di datagram socket
risposta dal server sulla si rimette in attesa di altri
datagram socket pacchetti
Alcuni costruttori
DatagramSocket() // binds to any available port
DatagramSocket(int) // binds to the specified port
Alcuni metodi
getLocalAddress() // returns the local address
getLocalPort() // returns the local port
UDPClient.java
import java.io.*;
import java.net.*;
class UDPClient {
public static void main(String args[]) throws Exception {
/* Inizializza linput stream (da tastiera) */
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
UDPClient.java (2)
/* Prepara il pacchetto da spedire specificando
* contenuto, indirizzo e porta del server */
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,
IPAddress, 9876);
UDPServer.java
import java.io.*;
import java.net.*;
class UDPServer {
public static void main(String args[]) throws Exception {
/* Inizializza la datagram socket specificando la porta di ascolto */
while(true)
{
UDPServer.java
sendData = capitalizedSentence.getBytes();
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
/* Attende 10 secondi */
Thread.sleep(10000);
outToClient.writeBytes(capitalizedSentence);
Nota bene
Una volta che il metodo run() termina, il thread termina
anchesso e non e possibile farlo ripartire.
Modello dispatcher/worker
MultiServer.java
import java.io.*;
import java.net.*;
class TCPMultiServer {
while(true) {
Socket connectionSocket = welcomeSocket.accept();
ServerThread.java
import java.io.*;
import java.net.*;
try{
inFromClient =
new BufferedReader(
new InputStreamReader(connectionSocket.getInputStream()));
outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
ServerThread.java (2)
public void run() {
String clientSentence;
String capitalizedSentence;
try {
clientSentence = inFromClient.readLine();
outToClient.writeBytes(capitalizedSentence);
connectionSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}