Java fornisce per la gestione della comunicazione le
classi del package di networking java.net le socket rappresentano il terminale (end point) di un canale di comunicazione bidirezionale Un Client e un Server su macchine diverse possono comunicare sfruttando due diversi tipi di modalit di comunicazione con connessione, in cui viene stabilita una connessione tra Client e Server (esempio, il sistema telefonico) Uso di socket STREAM senza connessione, in cui non c connessione e i messaggi vengono recapitati uno indipendente-mente dallaltro (esempio, il sistema postale) Uso di socket DATAGRAM classi per SOCKET INTERNET con connessione classe Socket, per socket lato Client, con connessione (TCP) classe ServerSocket, per socket lato Server, con connessione (TCP) senza connessione classe DatagramSocket, per socket (C/S) senza connessione (UDP) C/S in Java: Socket in Java - 1 Gerarchia delle classi in Java Package java.net Le classi sono state significativamente estese dalla diverse versioni delle JVM per tenere conto delle diverse necessit applicative C/S in Java: Socket in Java - 2 Sistema di NOMI Necessit di definire un sistema di identificazione delle entit messe in gioco Unapplicazione distribuita costituita da processi distinti per localit che comunicano e cooperano attraverso lo scambio di messaggi, per ottenere risultati coordinati Il primo problema da affrontare riguarda la identificazione dei processi (il Client o il Server) nella rete Per ogni processo bisogna definire un NOME GLOBALE visibile in modo univoco e sempre non ambiguo nome della macchina + nome del processo allinterno della macchina Gli endpoint di processo (socket) sono tipicamente locali al processo stesso (livello applicativo o sottostante fino a sessione) Il problema risolto dai livelli sottostanti di protocollo per le socket nel dominio Internet i nomi di trasporto (TCP, UDP) e rete (IP) C/S in Java: Socket in Java - 3 NOMI per SOCKET Una macchina identificata univocamente da un indirizzo IP (4 byte / 32 bit) (livello IP) La porta un numero intero di 16 bit (astrazione fornita dal TCP e da UDP) NOME GLOBALE I messaggi sono consegnati su una specifica porta di una specifica macchina, non direttamente a un processo NOME LOCALE Un processo si lega a una porta per ricevere (o spedire) dei messaggi o anche pi processi si collegano In questo modo possibile identificare un processo senza dover conoscere il suo process identifier (pid) Un indirizzo IP e una porta possono rappresentare un endpoint di un canale di comunicazione NOME IP livello network - OSI 3 NUMERO PORTA livello trasporto - OSI 4 C/S in Java: Socket in Java - 4 NOMI GLOBALI Numeri IP => vedi protocollo IP indirizzo IP: ad es. 137.204.57.186 Numeri di Porta porte 4 cifre hex: XXXXh spesso espresse con unico decimale ad es. 153, 2054 Funzione fondamentale delle porte identificare un servizio I numeri di porta minori di 1024 sono riservati (well-known ports, o reserved) sono standardizzati i servizi offerti dai processi che a tale porta sono legati Per esempio, il servizio Web identificato dalla porta numero 80, cio il processo server di un sito Web deve essere legato alla porta 80, su cui riceve i messaggi con le richieste di pagine html Altri esempi: porta 21 per ftp, porta 23 per telnet, porta 25 per mail, La richiesta di un servizio a un processo server non richiede quindi la conoscenza del suo pid, ma solo della porta e IP (nomi globali) C/S in Java: Socket in Java - 5 Caso di Server sequenziale o iterativo una richiesta alla volta (con connessione o meno) I tempi di risposta al servizio aumentano ==> servizi brevi server sequenziale senza connessione servizi senza stato (che introduce ritardi) e non soggetti a guasti Azioni Processo Server Controllore C1 Cn #portaserver unica coda risposta sulla porta cliente server sequenziale con connessione servizi con requisiti di reliability limitando lo stato (uso di TCP) difficile realizzazione pratica overhead delle azioni di controllo della connessione Azioni Processo Server Controllore C1 Cn #portaserver unica coda iniziale risposta sulla porta cliente C1 unica connessione stabilita #portac1 #portac1 #portaserver C/S in Java: Socket in Java - 6 Server concorrente pi richieste alla volta (multi o singolo processo) SERVER PARALLELO processi multipli uso di processi multipli, un master server generazione di processi interni per ogni servizio massimo parallelismo per servizi non interferenti Si deve garantire che il costo di generazione del processo non ecceda il guadagno ottenuto Soluzione con processi creati in precedenza che consentano di essere velocemente smistati al servizio necessario numero prefissato di processi iniziali e altri creati su necessit e mantenuti per un certo intervallo Server parallelo senza connessione Azioni Processi Client attivi Processi Server Processo Server Controllore C1 Cn C1 Cn Ci #porta1 #portan #porta1 #portan Porte differenziate #portaserver generazione processo Un canale unico e un processo per ogni servizio C/S in Java: Socket in Java - 7 SERVER concorrente singolo processo non parallelo in caso di connessione e stato (limitati) realizzato con un unico processo che produce effetti di concorrenza dal punto di vista dei clienti l'unico processo master deve considerare tutte le richieste ed servirle al meglio (mantenendo le connessioni) Facciamo il caso di connessione (ma anche senza) Azioni Processi Client attivi Unico Processo Server Processo Server Controllore C1 Cn C1 Cn Ci #porta1 #portan connessione #portaserver richieste iniziali connessione Processo Server Controllore Necessit di rispondere in modo veloce alle richieste successive e sollecitazioni (REALIZZABILE IN JAVA???) C/S in Java: Socket in Java - 8 SOCKET per DATAGRAM Le socket DATAGRAM permettono a due thread di scambiarsi messaggi senza stabilire una connessione tra i thread convolti meccanismo di comunicazione non affidabile possibili perdite di messaggi (per problemi di rete) consegna non in ordine a causa del protocollo UDP Vi un solo tipo di socket DATAGRAM sia per il Client sia per il Server La classe java.net.DatagramSocket public final class DatagramSocket extends Object Costruttore (ce ne sono altri) DatagramSocket( InetAddress localAddress, int localPort) throws... il costruttore DatagramSocket crea socket UDP e fa un binding locale a porta e nome IP SCAMBIO MESSAGGI usando send e receive sock.send(DatagramPacket); sock.receive(DatagramPacket); Si usano sempre classi accessorie di supporto C/S in Java: Socket in Java - 9 SOCKET DATAGRAM Necessit di protocollo Scambio di messaggi da socket datagram Socket Socket Socket invio Porta1 Nome IP invio Socket Socket Socket ricezione Porta2 Nome IP ric. Le due socket messe in gioco devono essere state inizializzate correttamente (create) devono conoscersi In particolare chi invia: il mittente deve specificare nel messaggio che vuole comunicare con un ricevente (e una sua socket) Si devono specificare informazioni di tipo applicativo parte dati il messaggio (o lo spazio per il messaggio) di controllo comunicazione parte controllo il nodo del ricevente, la porta per arrivare alla socket del ricevente Nessuna garanzia nelle operazioni a causa del protocollo di supporto (UDP e IP) C/S in Java: Socket in Java - 10 Classi Accessorie DatagramPacket Classe introdotta per usare e preparare datagrammi che consentono di specificare cosa comunicare (parte dati) come comunicare e con chi (parte controllo) Una istanza datagramma specifica un array di byte da/su cui scrivere e con indicazioni di comunicazione con diversi costruttori Parte controllo Interi per la porta e InetAddress InetAddress classe per gli indirizzi IP ad esempio public static InetAddress getByName (String hostname); solo alcuni metodi pubblici statici (public static): getByName(String hostname); fornisce un oggetto InetAddress per lhost specificato (null default locale) InetAddress[ ] getAllByName(String hostname); fornisce un array di oggetti InetAddress per pi indirizzi IP sullo stesso nome logico InetAddress getLocalHost(); fornisce InetAddress per macchina locale C/S in Java: Socket in Java - 11 Parte Dati Dati utente Tramite un Contenitore unificato DatagramPacket( byte [] buf, // array di byte dati int offset, // indirizzo inizio int length, // lunghezza dati InetAddress address, // indirizzo IP int port); // porta che prevede anche molti altri costruttori e molte funzioni di utilit come getAddress(), setAddress(InetAddress addr) getPort(), setPort(int port) getData(), setData(byte[] buf), Nel DatagramPacket si deve considerare luso a secondo della funzione che stiamo invocando: in invio dobbiamo avere una area su cui lutente possa mettere i dati e l'area per accogliere le informazioni di controllo sul ricevente (fornite dal mittente del pacchetto). in ricezione dobbiamo avere preparato tutto per ricevere tutte le informazioni, sia per la parte dati, sia per la parte di controllo (indirizzo del mittente) C/S in Java: Socket in Java - 12 Schema di comunicazione Creazione socket DatagramSocket socket = new DatagramSocket(); Preparazione informazione da inviare e invio byte[] buf = {'C','i','a','o'}; InetAddress addr = InetAddress. getByName("137.204.59.72"); int port = 1900; DatagramPacket packet = new DatagramPacket (buf, buf.length, addr, port); socket.send(packet); Preparazione, attesa informazione, e ricezione int report; InetAddress recaddress; byte [] result = new byte [200]; socket.receive(packet); recport = packet.getPort(); recaddress = packet.getAddress(); result = packet.getData(); // uso delle informazioni C/S in Java: Socket in Java - 13 Socket Multicast Sono anche possibili ulteriori classi per inviare messaggi multicast e gruppi di multicast Preparazione gruppo: IP classe D e porta libera InetAddress gruppo = InetAddress. getByName("229.5.6.7"); MulticastSocket s = new MulticastSocket(6666); Operazioni di ingresso/uscita dal gruppo // unisciti al gruppo ... s.joinGroup(gruppo); byte[] msg = {'H', 'e', 'l', 'l', 'o'}; DatagramPacket packet = new DatagramPacket (msg, msg.length, gruppo, 6666); s.send(packet); // ottenere i messaggi inviati byte[] buf = new byte[1000]; DatagramPacket recv = new DatagramPacket (buf, buf.length); s.receive(recv); ... // esci dal gruppo ... s.leaveGroup(group); C/S in Java: Socket in Java - 14 SOCKET per STREAM Le socket STREAM sono i terminali di un canale di comunicazione virtuale creato prima di comunicare tra il Client e il Server La comunicazione avviene in modo bidirezionale, affidabile, con dati (byte) consegnati in sequenza una sola volta (modalit FIFO come sulle pipe di Unix) e se non consegnati??? semantica at-most once La connessione tra i processi Client e Server definita non dai processi che devono comunicare ma da una quadrupla univoca <protocollo; indirizzo IP Client; porta Client; indirizzo IP Server; porta Server> Nel caso delle socket STREAM, il protocollo di comunicazione sottostante il protocollo TCP (+ IP) TCP un protocollo di trasporto, livello 4 OSI e fornisce lastrazione porta IP un protocollo di rete, livello 3 OSI e identifica univocamente ogni macchina collegata alla rete Internet La comunicazione tra Client e Server su stream segue uno schema asimmetrico e il principio della connessione (relative API diverse) Questa considerazione ha portato al progetto di due tipi di socket diverse una per il Client e una per il Server C/S in Java: Socket in Java - 15 SOCKET per STREAM Socket Socket Client Application Socket Socket Client Application Socket Socket Server Application Server Socket Server Socket Socket Socket Richiesta di connessione Protocollo di Comunicazione con Connessione in Java Classi distinte per ruoli Cliente e Servitore La classe java.net.Socket La classe java.net.ServerSocket I costruttori delle classi tendono a nascondere i dettagli realizzativi I costruttori creano la socket, la legano a una porta locale e la connettono a una porta della macchina remota (Unix API pi complesse e complete: vedi socket, bind, connect) C/S in Java: Socket in Java - 16 Lato CLIENTE La classe Socket consente di creare una socket con connessione, stream (TCP) per il collegamento di un Client a un Server socket detta anche socket attiva I costruttori della classe creano la socket, la legano a una porta locale e ... la connettono a una porta di una macchina remota su cui sta il server La connessione permette poi una comunicazione bidirezionale (full duplex) Socket Socket Client Socket Server Application Server Socket Server Socket Socket Porta Nome IP Si noti che la creazione della socket produce in modo atomico anche la connessione al server corrispondente (deve essere presente) (Unix API pi complesse e complete: vedi socket, bind, connect) C/S in Java: Socket in Java - 17 Operazioni CLIENTE - costruttori public Socket(InetAddress remoteHost, int remotePort) throws IOException; Crea una socket stream cliente e la collega alla porta specificata della macchina allindirizzo IP dato (equivale in Unix a: socket, bind, connect) public Socket(String remoteHost, int remotePort) throws IOException; Crea una socket stream cliente e la collega alla porta specificata della macchina di nome logico remoteHost public Socket(InetAddress remoteHost, int remotePort, InetAddress localHost, int localPort) throws IOException; Crea una socket stream cliente e la collega sia a una porta della macchina locale (se localPort vale zero, il numero di porta scelto automaticamente dal sistema) sia a una porta della macchina remota (macchine multihomed) La creazione della socket produce in modo atomico anche la connessione al server corrispondente o lancia la eccezione opportuna C/S in Java: Socket in Java - 18 Connessioni la creazione di una socket a stream se va a buon fine produce una connessione bidirezionale a byte (stream) tra i due processi interagenti e impegna risorse sui nodi e tra i processi APERTURA ottenuta con il costruttore in modo implicito CHIUSURA operazione necessaria per non impegnare troppe risorse di sistema Le risorse diventano le connessioni: costa definirle e crearle, come distruggerle e mantenerle Si tendono a mantenere le sole connessioni necessarie Limiti alle aperture contemporanee di sessioni Il numero di connessioni che un processo (Client o Server) pu aprire limitato, => si chiudono le connessioni non utilizzate Il metodo close() chiude loggetto socket e disconnette il Client dal Server public synchronized void close() C/S in Java: Socket in Java - 19 Operazioni CLIENTE - supporto Per ottenere informazioni sulle socket si possono utilizzare i metodi aggiuntivi public InetAddress getInetAddress(); restituisce lindirizzo della macchina remota a cui la socket connessa public InetAddress getLocalAddress(); restituisce lindirizzo della macchina locale public int getPort(); restituisce il numero di porta sulla macchina remota cui la socket connessa public int getLocalPort(); restituisce il numero di porta sulla macchina locale a cui la socket legata Esempio: int porta = oggettoSocket.getPort(); Socket Socket Client Socket Server Application Server Socket sul Server Socket Socket Porta Nome IP Porta Nome IP C/S in Java: Socket in Java - 20 Uso di stream tipici di Java Operazioni di comunicazione su stream Lettura o scrittura da/su una socket con i metodi: public InputStream getInputStream() ritorna linput stream per leggere dei byte dalla socket public OutputStream getOutputStream() ritorna loutput stream per scrivere dei byte sulla socket I due metodi restituiscono un oggetto stream che incapsula il canale di comunicazione (di classi InputStream e OutputStream) Attraverso gli stream si possono spedire/ricevere solo byte, senza nessuna formattazione naturalmente i byte arrivano ordinati non duplicati (non possono arrivare byte successivi, senza che arrivino i precedenti) i dati arrivano al pi una volta at-most-once e in caso di errore? nessuna conoscenza Altri oggetti possono incapsulare questi stream, per fornire funzionalit di pi alto livello (es., DataInputStream) C/S in Java: Socket in Java - 21 Esempio Client di echo (il Server Unix sulla porta 7) . . . try { oggSocket = new Socket(hostname, 7); /* input ed output sugli endpoint della connessione via socket */ out = new PrintWriter (oggSocket.getOutputStream(),true); in = new BufferedReader (new InputStreamReader (oggSocket.getIntputStream()); /* lettura da input */ userInput = new BufferedReader( new InputStreamReader(System.in)); while((oggLine = userInput.readLine()) != null) /* lettura input fino a fine file */ { out.println(oggLine); System.out.println(in.readLine()); } oggSocket.close(); } // fine try catch (IOException e) { System.err.println(e);} ... C/S in Java: Socket in Java - 22 La classe java.net.ServerSocket Lato server La classe ServerSocket definisce una socket capace di accettare richieste di connessione provenienti dai diversi Client pi richieste di connessione pendenti allo stesso tempo e pi connessioni aperte contemporaneamente Definisce anche la lunghezza della coda in cui vengono messe le richieste di connessione non ancora accettate dal server Una volta stabilita la connessione (ottenuta dal server tramite il metodo accept) la trasmissione dei dati avviene attraverso un normale oggetto Socket del server (restituito dalla accept) Al momento della creazione si effettuano implicitamente le operazioni pi elementari visibili in UNIX, come socket, bind e listen C/S in Java: Socket in Java - 23 Costruttori per il server public ServerSocket(int localPort) throws IOException, BindException; crea una socket in ascolto sulla porta specificata public ServerSocket(int localPort, int count) throws IOException, BindException; crea una socket in ascolto sulla porta specificata con una coda di lunghezza count Le richieste accodate non sono servite automaticamente => necessit di un API che esprima la volont di servizio Il server gioca un ruolo "passivo" deve specificare la coda delle possibili richieste ed aspettare i clienti comincia a decidere con la introduzione volontaria della primitiva di accettazione esplicita ACCEPT di una connessione C/S in Java: Socket in Java - 24 ACCEPT di connessione Il Server si mette in attesa di nuove richieste di connessione chiamando il metodo accept() La invocazione di accept blocca il Server fino allarrivo di una richiesta Quando arriva una richiesta, accept stabilisce una la reale connessione tra il Client e un nuovo oggetto Socket restituito da accept e che rappresenta lo stream con il cliente public Socket accept() throws IOException; La accept restituisce un oggetto della classe Socket su cui avviene la comunicazione tra Client e Server la chiamata di accept mette il servitore in attesa di richieste di connessione Tipicamente se non ci sono ulteriori richieste, il servitore si blocca in attesa Se c almeno una richiesta, si sblocca la primitiva e si crea la connessione per questa La trasmissione dei dati avviene con i metodi visti per il lato Client in modo del tutto indifferente in uno o l'altro verso della connessione i due endpoint sono del tutto omogenei (uso di protocollo TCP) C/S in Java: Socket in Java - 25 Informazioni sulle socket connesse: public InetAddress getInetAddress() restituisce lindirizzo della macchina locale a cui la socket server connessa public int getLocalPort() restituisce il numero di porta sulla macchina locale Server daytime (il Server Unix su porta 13) ... oggServer = new ServerSocket(portaDaytime); try { /* il server alla connessione invia la data al cliente */ while (true) { oggConnessione = oggServer.accept(); out = new PrintWriter (oggConnessione.getOutputStream(), true); Date now=new Date(); // produce la data out.write(now.toString()+ "\r\n"); oggConnessione.close(); } } catch (IOException e) { oggServer.close(); oggConnessione.close(); System.err.println(e); } . . . C/S in Java: Socket in Java - 26 Server Parallelo con connessione accept (); <attesa su ServerSocket> <generazione thread> <padre continua> < servizio della richiesta uso di Socket > Nuovo Thread Thread Server (padre) R ic h ie sta d i c o n n e ssio n e Comunicazione Client/Server Alla accettazione il servitore pu generare una nuova attivit responsabile del servizio (che eredita la connessione nuova) Il servitore principale pu aspettare nuove richieste e servire nuove operazioni C/S in Java: Socket in Java - 27 Esempio possible Remote CoPy (RCP) Si realizzi unapplicazione distribuita Client/Server per eseguire la copia remota (remote copy, rcp) di file Progettare sia il programma client sia il programma server Il programma Client deve consentire la invocazione: rcp_client nodoserver portaserver nomefile nomefiledest nodoserver e portaserver indicano il nome Server e nomefile il nome di un file presente nel file system della macchina Client Il processo Client deve inviare il file nomefile al Server che lo scrive nel direttorio corrente con nome nomefiledest La scrittura del file nel direttorio specificato deve essere eseguita solo se in tale direttorio non presente un file con lo stesso nome, evitando di sovrascriverlo Uso di connessione: il file richiede di trasferire anche grosse moli di dati e in ordine La connessione aperta dal cliente consente al server di coordinarsi per la richiesta del file che viene inviato !Versione non ottimizzata da migliorare! C/S in Java: Socket in Java - 28 RCP Client Estratto del client ... rcpSocket = new Socket(host,porta); OutSocket = new DataOutputStream (rcpSocket.getOutputStream()); InSocket = new DataInputStream (rcpSocket.getInputStream()); OutSocket.writeUTF (NomeFileDest); Risposta = InSocket.readUTF(); System.out.println(Risposta); if (Risposta.equalsIgnoreCase ("MSGSrv: attendofile") == true) {FDaSpedDescr = new File(NomeFile); FDaSpedInStream = new FileInputStream(FDaSpedDescr); byte ContenutoFile [] = new byte [FDaSpedInStream.available()]; FDaSpedInStream.read(ContenutoFile); StrDatiOutSocket.write (ContenutoFile); }} // file letto tutto in un colpo? catch (IOException e) {System.err.println(e);} rcpSocket.close(); ... UTF formato standard Unified Transformation Format per maggiore portabilit C/S in Java: Socket in Java - 29 RCP Server iterativo sequenziale ... try { rcpSocketSrv = new ServerSocket(Porta); System.out.println("Attesa su porta" + rcpSocketServer.getLocalPort()); while(true) {SocketConn = rcpSocketSrv.accept(); System.out.println("con " + Socketconn); OutSocket = new DataOutputStream (SocketConn.getOutputStream()); InSocket = new DataInputStream (SocketConn.getInputStream()); NFile = InSocket.readUTF (); FileDaScrivere = new File(NFile); if(FileDaScrivere.exists() == true) { OutSocket.writeUTF( "MSGSrv: file presente, bye"); } else { OutSocket.writeUTF( "MSGSrv: attendofile"); byte ContntFile[] = new byte [1000]; InSocket.read(ContntFile); FileOutputStream = new FileOutputStream (FileDaScrivere); FileOutputStream.write(ContntFile); } SocketConn.close(); } // file letto tutto nel buffer ? } catch (IOException e) {System.err.println(e);} ... C/S in Java: Socket in Java - 30 RCP Server concorrente parallelo ... try { ... rcpSocket = new ServerSocket(Porta); System.out.println("Attesa su porta" + rcpSocket.getLocalPort()); while(true) { rcpSocketConn = rcpSocket.accept(); threadServizio = new rcp_servizio (rcpSocketConn); threadServizio.start(); } } catch (IOException e) {System.err.println(e);} Si genera un nuovo processo per ogni connessione generata e su questa avviene la interazione Una socket usata visibile da tutti i thread (condivisione risorse): la prima close chiude la socket definitivamente per tutti i thread Si noti che le socket usate dai thread sono tutte considerate impegnate per il sistema di supporto ???e se c' un limite al numero di socket aperte per processo??? (e le porte?) C/S in Java: Socket in Java - 31 RCP Server Processi Figli public class rcp_servizio extends Thread { ... rcp_servizio(Socket socketDaAccept) {rcpSocketSrv = socketDaAccept;} public void run() { System.out.println("thread numero " + Thread.currentThread()); System.out.println(""Connesso con" + + rcpSocketSrv); try {OutSocket= new DataOutputStream (rcpSocketSrv.getOutputStream()); InSocket = new DataInputStream (rcpSocketSrv.getInputStream()); NomeFile = InSocket.readUTF(); FileDaScrivere = new File(NomeFile); if(FileDaScrivere.exists () == true) /* in caso le cose siano terminate senza invio /* { OutSocket.writeUTF( "MSGSrv: file presente, bye"); } C/S in Java: Socket in Java - 32 /* solo in caso si consenta di trasmettere il file /* else /* scrittura effettiva del file */ { OutSocket.writeUTF( "MSGSrv: attendofile"); byte ContentFile [] = new byte [1000]; InSocket.read(ContentFile); FileDaScrivereOutputStream = new FileOutputStream (FileDaScrivere); FileDaScrivereOutputStream.write (ContentFile); } /* chiusura della connessione e terminazione del servitore specifico */ rcpSocketSrv.close(); System.out.println( "Fine servizio thread numero " + Thread.currentThread()); } catch (IOException e) { System.err.println(e); exit(1);} ... C/S in Java: Socket in Java - 33 Chiusura delle Socket Le socket in Java impegnano non solo il loro livello applicativo, ma anche una serie di risorse di sistema che sono collegate e necessarie per la operativit La chiusura quindi necessaria sempre per dichiarare la non necessit di mantenere risorse non pi in uso In casa di una socket chiusa, le risorse sono mantenute per un certo tempo (in dipendenza dalla importanza delle operazioni) In caso di socket connessa chiusa, la memoria viene mantenuta per continuare a spedire informazioni da inviare al pari Il pari si accorge di questo tramite: - eventi che gli vengono notificati in caso di operazioni (tipo lettura o scrittura sulla sua socket) - eccezioni o predicati Si vedano alcune funzioni come: isClosed (); isConnected (); isInputShutdown (); isOutputShutdown (); C/S in Java: Socket in Java - 34 Opzioni delle Socket Si esplorino le opzioni delle socket in Java con funzioni definite SetSoTimeout (int timeout) throws... la lettura da socket (es., read()) bloccante. Questa opzione definisce un timeout (in msec), trascorso il quale si sblocca la read (ma viene lanciata una eccezione da gestire) timeout a zero, nessuna sospensione SetSendBufferSize (int size) throws... il buffer di invio dello stream pu essere variato SetReceiveBufferSize (int size) il buffer di invio dello stream pu essere variato SetReuseAdddress () si possono collegare pi processi (e socket) ad un certo indirizzo fisico Solo socket a stream SetSoLinger (boolean on, int linger) dopo la close, il sistema tenta di consegnare i pacchetti ancora in attesa di spedizione. Questa opzione permette di scartare i pacchetti in attesa (linger in sec) SetTcpNoDelay (boolean on) throws ... il pacchetto inviato immediatamente, senza bufferizzare SetKeepAlive (boolean on) throws... abilita, disabilita la opzione di keepalive Sono previste le get corrispondenti le opzioni sono disponibili nella classe SocketOptions C/S in Java: Socket in Java - 35 URL Inoltre visto l'ampio uso di Indirizzi Web La classe java.net.URL http://deis.unibo.it/index.html La classe URL descrive le risorse Internet metodo getContent protocol handler content handler Scaricamento di una pagina ... URL deis = new URL ("http://www.deis.unibo.it/"); BufferedReader in = new BufferedReader( new InputStreamReader( deis.openStream())); String inLine; while ((inLine = in.readLine())!=null) System.out.println(inLine); in.close(); ... possibilit di agganciarsi dinamicamente ad un URL e di gestire il trasferimento via protocollo HTTP C/S in Java: Socket in Java - 36