J0 1 Marco Ronchetti - Java Networking TCP.

Slides:



Advertisements
Presentazioni simili
Text Processing Google APi
Advertisements

TAV.1 Foto n.1 Foto n.2 SCALINATA DI ACCESSO ALL’EREMO DI SANTA CATERINA DEL SASSO DALLA CORTE DELLE CASCINE DEL QUIQUIO Foto n.3 Foto n.4.
1 Le s-espressioni. 2 Un nuovo esempio completo: le s-espressioni Sexpr 4 alberi binari (possibilmente vuoti) che hanno sulle foglie atomi (stringhe)
1 Progettazione gerarchica delle s- espressioni, utilizzando lereditarietà
Socket Java Alberto Ferrari.
Interfacce Java.
WSDL (Web Services Description Language) Laurea Magistrale in Informatica Reti 2 (2006/07) dott. Federico Paoloni
Programmazione con socket
JPA Overview della tecnologia. Java Persistence Architecture Definita nella JSR-220 EJB 3.0 ( Tentativo di unificare EJB2.1 con.
1 Processi e Thread Processi Thread Meccanismi di comunicazione fra processi (IPC) Problemi classici di IPC Scheduling Processi e thread in Unix Processi.
Frontespizio Economia Monetaria Anno Accademico
L'interfaccia socket in Java
Come programmare servizi di rete?
Esempio: Tombola! Parte seconda.
Unified Modeling Language class C {…} class B extends C {…} Esiste una notazione grafica per mostrare le relazioni di ereditarietà. Object StringC B Tutte.
J0 1 Marco Ronchetti Java Threads & Sincronizzazione.
J0 1 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.
J0 1 Marco Ronchetti - Corso di Formazione Sodalia – Febbraio 2001 – Modulo Web Programming Tomcat configuration.
Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.
Richiami di TCP Networking in Java Elementi di base.
Richiami di Java Multithreading. Threads (subclassing) public class A { public void a_method { C t = new C(); //C t = new C(String name); t.start(); …
Sezione: Costruttori Costruttori. Definizione dei costruttori Se per una classe A non scrivo nessun costruttore, il sistema automaticamente crea il costruttore.
prompt> java SumAverage
1 struct Pila { private: int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public: Pila(int initialSize) ; Pila();
Programmazione 1 9CFU – TANTE ore
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
Ufficio Studi UNIONCAMERE TOSCANA 1 Presentazione di Riccardo Perugi Ufficio Studi UNIONCAMERE TOSCANA Firenze, 19 dicembre 2000.
1. Conoscere luso delle collezioni in Java Comprendere le principali caratteristiche nelle varie classi di Collection disponibili Saper individuare quali.
JAVA C import java.util.*; #include <stdio.h>
1 Esercitazione sui segnali Problema: creare un programma analizzatore di file testuali che prenda come argomenti il nome di un file e una sequenza di.
2: Application Layer1 DNS: Domain Name System Persone: molte mezzi di identificazione: m CF, nome, # Passaporto Host, router Internet: m Indirizzi IP (32.
Lettura e scrittura - Stream
Programming with JXTA Hello World Peer discovery Peer Group discovery Creating Peer group Joining a Peer Group.
6.6Ordinamento di Vettori Ordinamento di dati –Applicazione computazionale importante –Virtualmente ogni organizzazione deve ordinare dei dati Enormi quantità
2000 Prentice Hall, Inc. All rights reserved. 1 Capitolo 6: Classi e astrazione dati 1.Introduzione 2.Definizione delle strutture 3.Accedere ai membri.
Gestione File System e I/O in Windows 2000 Implementazione del File System FAT-12, FAT-16, FAT-32 NTFS API relative al File System Gestione dei dispositivi.
Programmazione distribuita in Java
Players: 3 to 10, or teams. Aim of the game: find a name, starting with a specific letter, for each category. You need: internet connection laptop.
Java base VI: Gestione I/O. Argomenti Introdurre le API per linput e output in Java.
Sequence. CREARE UNA SEQUENCE CREATE SEQUENCE nome [INCREMENT BY n] [START WITH n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] [CYCLE | NOCYCLE]
Componenti dell’architettura Oracle
JAVA E LA RETE L’architettura Java è network-ready
DATA LINK PHYSICAL IP TRASPORTO APPLICATIVOclient PHYSICAL IP TRASPORTO APPLICATIVOserver Un Client è interconnesso ad un Server attraverso una porzione.
2 3 4 RISERVATEZZA INTEGRITA DISPONIBILITA 5 6.
Melfi, 1 aprile 2011 – MediaShow 1 Social Network: possibilità di uso consapevole nella didattica Uso, consapevolezza, opportunità, proposte Caterina Policaro.
JavaScript Lezione 5 Tipizzazione ed operazioni tra tipi diversi Istruzioni di input.
Moduli o Form I Moduli permettono all'utente di immettere informazioni...
INTERNET Antonio Papa Classe 2^ beat I.S.I.S. G. Meroni a.s. 2007/2008.
1 Negozi Nuove idee realizzate per. 2 Negozi 3 4.
ISOIVA (LOCALE) TO ISOIVA (WEB) RIPARTIZIONE INFORMATICA UFFICIO APPLICATIVI AMMINISTRATIVI 13/04/2011 UNIVERSITÀ DEGLI STUDI DI FERRARA 1.
Scheda Ente Ente Privato Ente Pubblico. 2ROL - Richieste On Line.
Cosa è una applicazione distribuita?
Bando Arti Sceniche. Per poter procedere è indispensabile aprire il testo del Bando 2ROL - Richieste On Line.
24 aprile 2002 Avvisi: Risultati 1 o Esonero: (entro) lunedi 27 disponibili nella pag. WEB, ma anche esposti nella bacheca fuori dal corridoio 2 o dente,
21 marzo 2002 (ri-)Avvisi: Giovedi 28 marzo la lezione e sospesa. Nuovo indirizzo di Spedire messaggi e esercizi solo.
Visual Studio Tools for Office: Developer Solutions Platform Fulvio Giaccari MCSD.NET / MCT Responsabile Usergroup ShareOffice Blog:
Test con JUnit. zJUnit è un ambiente di test per programmi Java ySviluppato da Kent Beck É possibile usare JUnit allinterno di Eclipse per eseguire i.
1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
Negli ultimi anni, la richiesta di poter controllare in remoto la strumentazione e cresciuta rapidamente I miglioramenti nell’hardware e nel software insieme.
Collection & Generics in Java
Sistemi di elaborazione dell’informazione Modulo 3 -Protocolli applicativi Unità didattica 4 - Protocolli del Web Ernesto Damiani Lezione 3 – Esempi HTTP.
JDBC Java DataBase Connectivity SISTEMI ITIS B. CASTELLI Anno Scolastico
Come comunicano i processi ?
Ingresso e uscita in Java F. Bombi 10 ottobre 2002.
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
Socket programming in Java La realizzazione di un server in Java consente di scrivere una sola versione eseguibile su diverse piattaforme. Il linguaggio.
Socket programming in Java La realizzazione di un server in Java consente di scrivere una sola versione eseguibile su diverse piattaforme. Il linguaggio.
I socket.
Il Livello di Trasporto
Transcript della presentazione:

J0 1 Marco Ronchetti - Java Networking TCP

J0 2 Marco Ronchetti - Sockets Java supporta un accesso semplificato e object- oriented alle sockets. Questo rende la network comunicazione di rete sensibilmente piu semplice. Molto piu semplice che in C++!! Vedremo che parlare ad un altra applicazione (locale o remota) puo essere semplice come leggere un file o ottenere un input da un utente.

J0 3 Marco Ronchetti - Clients and Servers Quando si scrivono network applications, e comune parlare di clients e servers. La distinzione e piuttosto vaga, ma sostanzialmente possiamo pensare che : chi inizia la conversazione e il client. chi accetta la richiesta di parlare e il server. Per I nostri scopi, la piu importante differenza tra client e server e che il client puo in qualunque istante creare una socket per iniziare una conversazione con una server application, mentre un server si deve preparare ad ascoltare in anticipo per possibili conversazioni in arrivo.

J0 4 Marco Ronchetti - Sockets La java.net.Socket class rappresenta un singolo lato di una connessione socket indifferentemente su un client o su un server. Inoltre, il server usa la java.net.ServerSocket class per attendere connessioni da clients. Un applicazione agente come server crea un ServerSocket object e attende, bloccato in una chiamata al suo metodo accept(), finche non giunge una connessione. A quel punto, il metodo accept() create un Socket object che il server usa per comunicare con il client.

J0 5 Marco Ronchetti - Sockets Un server mantiene molte conversazioni simultaneamente. Ce una sola ServerSocket, ma una oggetto Socket attivo per ogni cliente.

J0 6 Marco Ronchetti - Server port Un client ha bisogno di due informazioni per connettersi a un server su Internet: un nome di host (per recuperare lindirizzo del server) e un numero di porta (per individuare il processo sulla macchina server). Una applicazione server ascolta su una porta predefinita mentre attende una connessione. I clients selezionano il numero di porta corrispondente al servizio desiderato. I numeri di porta sono codificati nelle RFC (Es. Telnet 23, FTP 21, ecc.), ma possono anche essere scelti (quasi) arbitrariamente per applicazioni custom.

J0 7 Marco Ronchetti - Client port Il numero di porta del client e tipicamente assegnato dal sistema operativo: la scelta di tale numero non e di solito rilevante. Quando una client socket mand un pacchetto a una server socket, il pacchetto include la specifica della porta e dellindirizzo del cliente: cosi il server e in grado di rispondere.

J0 8 Marco Ronchetti - Sockets Usando le sockets, si deve decidere che tipo di protocollo si desidera per il trasporto di pacchetti sulla rete: Un protocollo connection-oriented o Un protocollo connectionless.

J0 9 Marco Ronchetti - Connection-oriented protocols Un protocollo connection-oriented offre lequivalente di una conversazione telefonica. Dopo aver stabilito la connessione, due applicazioni possono scambiarsi dati. La connessione rimane in essere anche se nessuno parla. Il protocollo garantisce che non vengano persi dati e che questi arrivino sempre nellordine corretto. La classe Java Socket usa un protocollo connection- oriented, e parla TCP

J0 10 Marco Ronchetti - Connectionless Protocols Un protocollo connectionless somiglia al servizio postale. Le applicazioni possono inviarsi brevi messaggi, ma non viene tenuta aperta una connessione tra un messaggio e laltro. Il protocollo NON garantisce che non vadano persi dati e che ne che questi arrivino nellordine corretto. La classe DatagramSocket usa un protocollo connectionless, e parla UDP

J0 11 Marco Ronchetti - Connection oriented Protocols Con un connection-oriented protocol, una client socket stabilisce, alla sua creazione, una connessione con una server socket. Stabilita la connessione, un protocollo connection-oriented assicura la consegna affidabile dei dati, ovvero: 1.Ogni pacchetto spedito, il pacchetto viene consegnato. Ad ogni spedizione, la socket si aspetta di ricevere un acknowledgement cheil pacchetto e stato ricevuto con sucesso. Se la socket non riceve lacknowledgement entro un tempo prestabilito, la socket ri-invia il pacchetto. La socket continua a provare finche la trasmissione ha successo, o finche decide che la consegna e impossibile.

J0 12 Marco Ronchetti - Connection oriented Protocols 2. I paccheti sono letti from dalla socket ricevente nello stesso ordine in cui sono stati spediti. Per il modo in cui la rete funziona, i pacchetti possono arrivare alla socket destinataria in un ordine diverso da quello in cui sono stati spediti. Un protocollo reliable, connection-oriented permette alla socket ricevente di riordinare i paccheti ricevuti, cosi che possano essere letti dal programma ricevente nellorine in cui erano stati spediti.

J0 13 Marco Ronchetti - java.net.Socket Questa classe implementa una socket per interprocess communication over the network. I constructor methods creano la socket e la connettono allo host e porta specificati.

J0 14 Marco Ronchetti - java.net.Socket Una volta creata la socket, getInputStream() e getOutputStream() ritornano oggetti InputStream e OutputStream che possono essere usati come se fossero canali di I/O su file. getInetAddress() e getPort() restituicono indirizzo e porta a cui la socket e connessa. getLocalPort() ritorna la porta locale usata dalla socket.

J0 15 Marco Ronchetti - java.net.ServerSocket Questa classe e usata dai servers per ascoltare le richieste di connessione. Quando si crea una ServerSocket, si specifica su quale porta si ascolta. Il metodo accept() iniza ad ascoltare su quella porta, e si blocca finche un client non richiede una connessione su quella porta. A quel punto, accept() accetta la connessione, creando e ritornando una Socket che il server puo usare per comunicare col client.

J0 16 Marco Ronchetti - Sockets Clients Un applicazione client apre una connessione con un server costruendo una Socket che specifica hostname e port number del server desiderato: try { Socket sock = new Socket( 80); //Socket sock = new Socket(" ", 80); } catch ( UnknownHostException e ) { System.out.println("Can't find host."); } catch ( IOException e ) { System.out.println("Error connecting to host."); }

J0 17 Marco Ronchetti - Connection-oriented protocol Il lato server di un protocollo connection-oriented tipicamente esegue questa sequenza: Crea un ServerSocket object per accettare connessioni. Quando il ServerSocket accetta la connection, crea un oggetto Socket che encapsula la connessione. Alla Socket viene chiesto di creare oggetti InputStream e OutputStream che leggono e scrivono bytes da e verso la connessione. La ServerSocket puo opzionalmente creare una nuova thread per ogni connessione, cosi che il server possa ascoltare per nuove connessioni mentre serve i clienti gia acquisiti.

J0 18 Marco Ronchetti - Reading & Writing raw bytes – Client side Una volta stabilita la connessione, input e output streams possono essere ottenuti con i metodi getInputStream() e getOutputStream() di Socket. try { Socket server = new Socket("foo.bar.com", 1234); InputStream in = server.getInputStream(); OutputStream out = server.getOutputStream(); // Write a byte out.write(42); // Read a byte Byte back = in.read(); server.close(); } catch (IOException e ) { }

J0 19 Marco Ronchetti - Reading & Writing newline delimited strings – Client Incapsulando InputStream & OutputStream e possibile accedere agli streams in modo piu semplice. try { Socket server = new Socket("foo.bar.com", 1234); InputStream in = server.getInputStream(); DataInputStream din = new DataInputStream( in ); OutputStream out = server.getOutputStream(); PrintStream pout = new PrintStream( out ); // Say "Hello" (send newline delimited string) pout.println("Hello!"); // Read a newline delimited string String response = din.readLine(); server.close(); } catch (IOException e ) { }

J0 20 Marco Ronchetti - Reading & Writing raw bytes – Server side try { ServerSocket listener = new ServerSocket( 1234 ); while ( !finished ) { Socket aClient = listener.accept(); // wait for connection InputStream in = aClient.getInputStream(); OutputStream out = aClient.getOutputStream(); // Read a byte Byte importantByte = in.read(); // Write a byte out.write(43); aClient.close(); } listener.close(); } catch (IOException e ) { }

J0 21 Marco Ronchetti - Reading & Writing newline delimited strings – Server try { ServerSocket listener = new ServerSocket( 1234 ); while ( !finished ) { Socket aClient = listener.accept(); // wait for connection InputStream in = aClient.getInputStream(); DataInputStream din = new DataInputStream( in ); OutputStream out = aClient.getOutputStream(); PrintStream pout = new PrintStream( out ); // Read a string String request = din.readLine(); // Say "Goodbye" pout.println("Goodbye!"); aClient.close(); } listener.close(); } catch (IOException e ) { }

J0 22 Marco Ronchetti - This server is single-threaded Questo server e single-threaded Tratta una sola connessione alla volta; non chiama accept() per ascoltare nuove connessioni fin quando non ha finito con quella corrente. Un server piu realistico avrebbe un loop che accetta connessioni e le passa ad altre thread per servirle concorrentemente.

J0 23 Marco Ronchetti - What about the Little Endian/Big Endian issue? Le classi Java DataInputStream and DataOutputStream lavorano con i bytes di tipi interi in network byte order (most significant to least significant). Percio non ce necessita di conversione dei dati!

J0 24 Marco Ronchetti - Limitations Applets e altre applicazioni che girano sotto il controllo del SecurityManager possono avere restrizioni arbitrarie su quali hosts possono raggiungere, e sul fatto di poter accettare connessioni. La security policy standard imposta dai browsers premette alle applets di aprire socket solo con lo host da cui provengono. Le applets are hanno il permesso di aprire server sockets.

J0 25 Marco Ronchetti - Limitations Ora, questo non significa che una applet non possa cooperare con il suo server per comunicare con chiunque e ovunque. Il server può girare un proxy che permette alla applet di comunicare indirettamente con chiunque. Questo pone lonere del controllo della sicurezza sul server originante, e non sulla macchina client.

J0 26 Marco Ronchetti - Un mini-server concorrente HTTP – Introduz. TinyHttpd ascolta su una port specificata and serve semplici richieste HTTP "get file: GET /path/filename [optional stuff] Il Web browser manda una o piu di queste linee per ogni documento da ottenere. Letta la richiesta, il server prova ad aprire il file specificato e ne spedisce il contenuto. Se il documento contiene referenze ad immagini o altro da mostrare online, il browser continua con richieste GET addizionali. Per ragioni di performance, TinyHttpd serve ogni richiesta in una sua thread. Percio TinyHttpd puo servire molte richieste concorrentemente.

J0 27 Marco Ronchetti - Un mini-server concorrente HTTP import java.net.*; import java.io.*; import java.util.*; public class TinyHttpd { public static void main( String argv[] ) throws IOException { ServerSocket ss = new ServerSocket(Integer.parseInt(argv[0])); while ( true ) new TinyHttpdConnection( ss.accept() ); }

J0 28 Marco Ronchetti - Un mini-server concorrente HTTP class TinyHttpdConnection extends Thread { Socket sock; TinyHttpdConnection ( Socket s ) { sock = s; setPriority( NORM_PRIORITY - 1 ); start(); } public void run() { try { OutputStream out = sock.getOutputStream(); DataInputStream d=new DataInputStream(sock.getInputStream()); String req = d.readLine(); System.out.println( "Request: "+req ); StringTokenizer st = new StringTokenizer( req );

J0 29 Marco Ronchetti - Un mini-server concorrente HTTP if ( (st.countTokens() >= 2) && st.nextToken().equals("GET") ) { if ( (req = st.nextToken()).startsWith("/") ) req = req.substring( 1 ); if ( req.endsWith("/") || req.equals("") ) req = req + "index.html"; try { FileInputStream fis = new FileInputStream ( req ); byte [] data = new byte [ fis.available() ]; fis.read( data ); out.write( data ); } catch ( FileNotFoundException e ) new PrintStream( out ).println("404 Not Found"); } else new PrintStream( out ).println( "400 Bad Request" ); sock.close(); } catch ( IOException e ) System.out.println( "I/O error " + e ); }

J0 30 Marco Ronchetti - Un mini-server concorrente HTTP - uso Compila TinyHttpd e mettilo nel tuo class path. Vai in una directory con qualche documento interessante e avvia il daemon, specificando un numero di porta non usato come argomento. Per esempio: % java TinyHttpd 1234 Ora dovrebbe essere possibile usare un Web browser standard per ottenere i files dal tuo host. Nella URL dovra essere specificato il numero di porta scelto. Per esempio, se il tuo hostname e venezia.sodalia.it, ed hai avviato il server come sopra, sara possibile ottenere il file welcome.html con:

J0 31 Marco Ronchetti - Un mini-server concorrente HTTP - Note Abbassando la sua priorita a NORM_PRIORITY-1, assicuriamo che la threads che serve le connessioni gia stabilite non blocchi la main thread di TinyHttpd impedendole di accettare nuove richieste.

J0 32 Marco Ronchetti - Un mini-server concorrente HTTP - Problemi TinyHttpd ha un sacco di possibilita di miglioramento! Primo: consuma un sacco di memoria allocando un array enorme per leggere un intero the file tutto dun colpo. Unimplementazione piu realistica userebbe un buffer ed invierebbe i dati in piu passei. TinyHttpd inoltre non riconosce semplici directories. Non sarebbe difficile aggiungere alcune lineee per leggere directories e generare liste di link HTML come fanno molti web server.

J0 33 Marco Ronchetti - Un mini-server concorrente HTTP - Problemi TinyHttpd soffre di limitazioni imposte dalla debolezza di accesso al filesystem. E importante ricordare che le pathnames sono architecture dependentcosi come il concetto stesso di filesystem. TinyHttpd funziona, cosi come, su systemi UNIX e DOS-like, ma richiede alcune variazioni su altre piattaforme. E possibile scrivere del codice piu elaborato code che usa environmental information offerte da Java per adattarsi al sistema locale.

J0 34 Marco Ronchetti - Un mini-server concorrente HTTP - Problemi Il problema principale con TinyHttpd e che non ci sono restrizioni sui files a cui puo accedere. Con qualche trucco, il daemon spedirebbe un qualunque file del suo filesystem al client. Sarebbe utile rlimitare TinyHttpd ai files che sono nella directory corrente, or una sua subdirectory.

J0 35 Marco Ronchetti - mini-server concorrente HTTP – Security Manager import java.io.*; class TinyHttpdSecurityManager extends SecurityManager { public void checkAccess(Thread g) { }; public void checkListen(int port) { }; public void checkLink(String lib) { }; public void checkPropertyAccess(String key) { }; public void checkAccept(String host, int port) { }; public void checkWrite(FileDescriptor fd) { }; public void checkRead(FileDescriptor fd) { }; public void checkRead( String s ) { if ( new File(s).isAbsolute() || (s.indexOf("..") != -1) ) throw new SecurityException ("Access to file : "+s+" denied."); }

J0 36 Marco Ronchetti - mini-server concorrente HTTP – Security Manager Il cuore di questo security manager e il metodo checkRead(). Controlla due cose: assicura che il pathname non sia assoluto, e che il pathname non contenga un double dot (..) che risale lalbero delle directories. Con questi vincoli siamo certi (almeno su un filesystem UNIX o DOS-like) di aver ristretto laccesso alle solo subdirectories della directory corrente. Se il pathname e absolute o contiene "..", checkRead() lancia una SecurityException.

J0 37 Marco Ronchetti - mini-server concorrente HTTP – Security Manager Gli altri metodi che non fanno nulla --e.g., checkAccess() permettono al daemon di fare il suo lavoro senza interferenza da paret del security manager. Quando installiamo un security manager, ereditiamo implementazioni di molte "check" routines. Limplementazione default non permette di fare nulla; Lancia una security exception appena chiamata. Dobbiamo aprire dei buchi cosicche il daemon possa fare il suo lavoro; deve accettare connections, ascoltare sockets, creare threads, leggere property lists, ecc. Per questo sovrascriviamo i metodi default.

J0 38 Marco Ronchetti - mini-server concorrente HTTP – Security Manager Per installare il security manager, aggiungere la seguente riga allinizio del main di TinyHttpd: System.setSecurityManager( new TinyHttpdSecurityManager() ); Per catturare le security exception, aggiungere il seguente catch dopo la catch di FileNotFoundException': catch ( SecurityException e ) new PrintStream( out ).println( "403 Forbidden" );

J0 39 Marco Ronchetti - A simple client import java.net.*; import java.io.*; import java.util.*; class Client{ public static void main(String[] args){ new Client() } // end main Client() { String server = "put your server name here"; int port = 25; //mail port try{ //Get a socket, connected to the specified server // on the specified port. Socket socket = new Socket(server,port);

J0 40 Marco Ronchetti - A simple client //Get an input stream from the socket BufferedReader inputStream = new BufferedReader(new InputStreamReader( socket.getInputStream())); //Get an output stream to the socket. Note // that this stream will autoflush. PrintWriter outputStream = new PrintWriter(new OutputStreamWriter( socket.getOutputStream()),true); //Begin the conversation with the server. outputStream.println( "mail from: put your name here"); System.out.println(inputStream.readLine()); outputStream.println( "rcpt to: " + "put your name here"); System.out.println(inputStream.readLine()); outputStream.println("data"); System.out.println(inputStream.readLine());

J0 41 Marco Ronchetti - A simple client String timeStamp = (new Date()).toString(); outputStream.println("Test message " + timeStamp); outputStream.println("."); System.out.println(inputStream.readLine()); //Close the socket socket.close(); }//end try catch(UnknownHostException e){ System.out.println(e); System.out.println( "Must be online to run properly."); }//end catch UnknownHostException catch(IOException e){System.out.println(e);} }//end constructor }//end class