Sei sulla pagina 1di 35

RETI – SOCKET IN JAVA

C: schema di comunicazione
con connessione
socket() socket()

bind()

listen()

accept() connect()

send() / receive() send() / receive()

close() close()

SERVER (iterativo) CLIENT


C: schema di comunicazione
senza connessione
socket() socket()

bind() bind()

sendto() / sendto() /
recvfrom() recvfrom()

close() close()

SERVER CLIENT
LING. C- DIFFICOLTA’ INDIRIZZI

= gethostbyname(“www.nome.dom”);

struct sockaddr_in
puntatore a AF_INET
sin_family
htons (porta) sin_port
struct hostent struct in_addr
bcopy()
unsigned long s_addr
h_addr
h_length
oppure

inetaddr(“xxx.xxx.xxx.xxx”);

aprile 2006 enea casali 4


JAVA: un aiuto per il programmatore
 Esistono classi già pronte per client e
server
 Il programmatore non deve farsi carico dei
dettagli implementativi, usa i metodi messi
a disposizione
 I progettisti di Java hanno sempre tenuto in
considerazione Internet, per cui la
programmazione in rete in questo
linguaggio è più semplice che in altri

aprile 2006 enea casali 5


Differenze rispetto al C
 Non abbiamo più il concetto di dominio
(Java implementa solo indirizzi INTERNET
non considerando altri meno usati
ATM,APPLETALK…)
 Non dobbiamo più preoccuparci di gestire
casi particolari e conversioni es. “localhost”
è identico a “127.0.0.1”
 Non ci sono più problemi di conversione di
formato per i numeri (la virtual machine
uniforma e gestisce le diverse
rappresentazioni Little e Big endian)
aprile 2006 enea casali 6
Package
 Per utilizzare le classi relative ai
socket è necessario:

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

aprile 2006 enea casali 7


SOCKET
CON CONNESSIONE (TCP)

aprile 2006 enea casali 8


jd
k 1.
4

CLIENT: classe Socket


public class Socket

public Socket()
public Socket(String host, int port) throws
UnknownHostException, IOException costruttori

public void connect(SocketAddress endpoint)
throws IOException
public InputStream getInputStream()
throws IOException
public OutputStream getOutputStream()
throws IOException
public void close() throws IOException

aprile 2006 enea casali 9


jd
k1
.4

SERVER: classi ServerSocket e Socket

public class ServerSocket

public ServerSocket() throws IOException


public ServerSocket(int port) throws
IOException costruttori
public ServerSocket(int port, int backlog)
throws IOException
… class Socket
public Socket accept() throws
IOException
public void close() throws IOException

aprile 2006 enea casali 10


jd
k 1.
4

Indirizzi: classe SocketAddress


public abstract class SocketAddress

public class InetSocketAddress extends SocketAddress


public InetSocketAddress(int port)
public InetSocketAddress(String hostname, int port)

aprile 2006 enea casali 11


java: schema di comunicazione
con connessione
ServerSocket() Socket()

Socket s=ServerSocket.accept() Socket.connect()

s.getOutputStream().write() / s.getInputStream().read() /
s.getInputStream().read() s.getOutputStream().write()

Socket.close() Socket.close()

SERVER (iterativo) CLIENT


CLIENT
import java.net.*;
In una sola istruzione !!!
import java.io.*;
Socket s = new Socket (“localhost”, 5000);

String host; // es. “localhost” oppure “127.0.0.1” oppure “nome-pc”
int port; // indico indirizzo e porta, dove il server offre il servizio
Socket s = new Socket();
SocketAddress sa = new InetSocketAddress(host, port);
s.connect(sa);

s.connect(new InetSocketAddress(host,port));

aprile 2006 enea casali 13


CLIENT (continua)
OutputStream out = s.getOutputStream();
out.write(‘x’);

InputStream in = s.getInputStream();
int car=in.read();

s.close();

aprile 2006 enea casali 14


Concatenamento del flusso
 Nel caso si vogliano leggere tipi primitivi quali int flaot
bytes ecc…:
in = new DataInputStream(socket.getInputStream())
out = new DataOutputStream(socket.getOutputStream())
in modo da poter usare metodi quali x=in.readInt() oppure
out.writeInt(x) ecc…

 Nel caso di flussi di caratteri bufferizzati:


in=new BufferedReader(new
InputStreamReader(socket.getInputStream()))
in modo da poter usare metodi quali riga=in.readLine()

out = new DataOutputStream(s.getOutputStream())


out.writeBytes(riga) //sulla socket viaggino bytes

aprile 2006 enea casali 15


Server
import java.net.*;
import java.io.*;
public class MioServer {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(5000); //port=5000
while(true){
Socket s = ss.accept();

String riga = new BufferedReader(new


InputStreamReader(s.getInputStream())).readLine();

new DataOutputStream(s.getOutputStream()).writeBytes(riga);
s.close();
}
}}

aprile 2006 enea casali 16


Esercizio1
 serverCapLet (Capital Letters =
lettere maiuscole) prende una stringa
con caratteri minuscoli e la restituisce
con caratteri maiuscoli. Il server
iterativo resta in funzione all’infinito
 clientCapLet legge una frase
dall’utente, la spedisce al server, la
riceve al ritorno maiuscola, la
visualizza e termina.

aprile 2006 enea casali 17


Server multi-thread
ServerSocket()

Socket s=ServerSocket.accept()

s.getOutputStream().write() /
Thread() s.getInputStream().read()

Socket.close()
Thread
 Un thread è anche definito “processo
leggero”
 Viene creato un nuovo flusso (thread
letteralmente si traduce come “filo”) di istruzioni
eseguito parallelamente a quelle del processo
che lo ha generato
 Un unico flusso sequenziale di istruzioni si divide
così in due “filoni” paralleli
 Condivide lo stesso spazio di memoria del
processo che lo ha generato e degli altri
eventuali thread

aprile 2006 enea casali 19


Come si crea un Thread in java

 1° modo) Estendendo la classe


Thread per ereditare e creare un
nuovo flusso di controllo

 2° modo) (NON LO VEDREMO)


Creando oggetti “runnable” cioé
implementando l’interfaccia Runnable

aprile 2006 enea casali 20


Come si definisce un Thread
class gestoreThread extends Tread {

public gestoreThread (String str) //costruttore


//str è il nome identificativo che assegniamo al Thread
super(str);
//chiama il costruttore della superclasse cioè Thread
}

public void run() { //metodo


// devo fornire un metodo con questo nome
// che contenga le istruzioni che voglio esegua il mio thread
}
}

aprile 2006 enea casali 21


Come si crea un Thread
 Per creare un nuovo thread

 Thread gestore = new gestoreThread(“nome”);

 Per renderlo “runnable”

 gestore.start();
start()
 Esempio:
class Esempio {
public static void main(String[] args){
new gestoreThread(“nome1”).start();
new gestoreThread(“nome2”).start();
}

aprile 2006 enea casali 22


Esercizio2: server-multithread
 Estendiamo l’esempio “capital letter”
creando un server che deleghi il
processo di convertire in maiuscolo
ad un thread ed accetti quindi altri
client entranti prima di aver concluso
con un precedente.

aprile 2006 enea casali 23


Esercizio3:
 ESERCIZIO: scrivere un server multithread
iterativo che accetti da client diversi sequenze
di numeri float e restituisca la somma.

Esempio di output:
Client2
Client1 introduci numeri il server calcolerà il
introduci numeri il server calcolerà il totale totale
introduci un num (0 per finire) introduci un num (0 per finire)
5.0 15
Totale = 5.0 Totale = 15.0
introduci un num (0 per finire) introduci un num (0 per finire)
16 30.2
Totale = 21.0 Totale = 45.2
introduci un num (0 per finire) introduci un num (0 per finire)

aprile 2006 enea casali 24


Esercizio4:
 Scrivere il client del procollo di posta smtp. Testarlo
utilizzando un server di posta quale ArgoMail,
scaricabile gratuitamente da internet.
 Si ricorda che il protocollo previsto è:

clientSMTP

HELO\n
ServerSMTP MAIL FROM: accaountposta\n
RCPT TO: accountposta\n
DATA\n
\n.\n
QUIT

aprile 2006 enea casali 25


Esercizio5:
 Scrivere un server multithread per la comunicazione
dell’esito degli esami agli studenti di un’università.
Descrivere il protocollo ed implementare infine il
servizio. Matricole e voti sono caricati in memoria da
file, all’avvio del server, che si mette poi in ascolto
dell’arrivo dei client.
 Protocollo:
clientStudenti

Matricola (5 caratteri)
ServerVoti Posizione / -1 se err (int)
Codice Materia (4 caratteri)
Voto / -1 se err (int)

aprile 2006 enea casali 26


SOCKET
SENZA CONNESSIONE (UDP)

aprile 2006 enea casali 27


Classi DatagramSocket DatagramPacket

 UDP trasmette DatagramPacket


 Non c’è uno stream perché non c’è
connessione
 Per spedire un pacchetto deve ogni
volta ribadire verso quale indirizzo e
porta

aprile 2006 enea casali 28


jd
k 1.
4
Classe DatagramSocket

public class DatagramSocket


public DatagramSocket() throws
SocketException
costruttori
public DatagramSocket(int port)
throws SocketException

public void
send(DatagramPacket p) throws
IOException metodi
public void
receive(DatagramPacket p)
throws IOException
close() ……

aprile 2006 enea casali 29


jd
k 1.
4

classe DatagramPacket

public final class DatagramPacket


public DatagramPacket(byte[] buf,
int length)
public DatagramPacket(byte[] buf, costruttori
int length, SocketAddress address)
throws SocketException

public byte[] getData()

aprile 2006 enea casali 30


Java: schema di comunicazione
senza connessione

s= new DatagramSocket(port1) s= new DatagramSocket(port2)

s.send(DatagramPacket) / s.receive(DatagramPacket) /
s.receive(DatagramPacket) s.send(DatagramPacket)

close() close()

SERVER / CLIENT CLIENT / SERVER


ALLEGATO A
clientCapLet.java
serverCapLet.java
ALLEGATO B
ServerCapLetMulti.java
ALLEGATO C
Cli_sommanum.java
Ser_sommanum.java
ALLEGATO D
UDPClient.java
UDPServer.java

Potrebbero piacerti anche