come fare una semplice chat in java
In questo tutorial vedremo come mettere in comunicazione un client e un server tramite le socket in java. Il tutto è composto da 2 semplici programmi...il primo a partire è il server che apre una porta tramite la classe ServerSocket ... il client si connette al suo indirizzo ip e alla sua porta tramite la classe Socket.... inizia la conversazione...tramite il client si potrà uscire dalla conversazione e sconnettere il server ....questo è solo un programma d'esempio posterò presto un applet java che simula una vera e propria chat utilizzando il multithread : ecco i programmi 1) SocketServer: import java.net.*; import java.io.*; public class SocketServer { String Input; boolean pulsanteS = false; // pulsante per alternare lo stream di lettura Socket socket; boolean cond = true; public void ascolto() throws Exception { BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));//con questo decoratore leggo i dati in input BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));//con questo scrivo DataOutputStream os = new DataOutputStream(socket.getOutputStream());//con questo mando l'outpit while (true) {// ciclo infinito di ascolto e output if(pulsanteS == false){// il pulsante server sta a false in questo caso userò lo stream di lettura di input Input = is.readLine();// ricevo l'input dal client if (Input == null ||Input.trim().equalsIgnoreCase("QUIT")) break; pulsanteS = true;// alla fine dell'if posiziono il pulsante a true in modo da poter usare l'altro strem di lettura System.out.println("dal client ho ricevuto: " + "\n" + Input); // stampo su consolle ciò ke ho ricevuto dal client System.out.println("lettura avvenuta rispondi al client:"); }else{ Input = stdIn.readLine(); // in questo caso uso lo stream di lettura da consolle os.writeBytes(Input + '\n');// mando i dati al client pulsanteS = false; //metto il pulsante a false per riusare l'altro stream di lettura } } cond = false; // quando esce dal ciclo infinito di output e di ascolto cond va a false così il serve si sconnette dopo ke il client gli ha mandato la conferma di uscita os.close();// chiudo i decoratori is.close(); socket.close();// chiudo la socket } public void Start()throws Exception { try{ ServerSocket serverSocket = new ServerSocket(7777);// creo un istanza serversocket di tipo ServerSocket passando al costruttore la porta libera while(cond){// quando cond è false il server si sconnette dal ciclo infinito di ascolto System.out.println("server attivo in attesa di ricevere dati dal client"); socket = serverSocket.accept();// questo metodo mi ridà un valore di tipo socket e serve per accettare la connessione del client this.ascolto();// quando il client si connette viene chiamato il metodo ascolto() } System.out.println("HAI SCONNESSO IL SERVER"); }catch (IOException e){ System.out.println("accettazione nn venuta"); } } public static void main(String[] args) throws Exception { SocketServer testserver = new SocketServer(); testserver.Start(); } } 2) SocketClient: import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class SocketClient { boolean pulsanteC = true; // pulsante per attivare lo strem di lettura da tastiera e di input dal server String Input; public void start() throws IOException{ Socket socket = new Socket("localhost", 7777);//creo l'istanza socket di tipo Socket e passo al costruttore l'indirizzo ip(del server) e la porta libera del server DataOutputStream os = new DataOutputStream(socket.getOutputStream());// apro uno stream di output per mandare dati al server BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));// apro uno strem di lettura per ricever dati dal server BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));// apro uno strem di lettura da consolle System.out.println("digita quello ke vuoi mandare al server"); System.out.println("per uscire e disconnettere il server digita quit :"); while (true) { // ciclo infinito di output e ascolto if(pulsanteC == true){// il pulsante parte da true ...in questo caso uso lo strem di lettura da consolle e lo posiziono in fine a false (ke mi servirà per usare lo stream di lettura di dati in input dal server) Input = stdIn.readLine();// leggo ciò ke ho digitato da tastiera if (Input.trim().equalsIgnoreCase("QUIT")) break; os.writeBytes(Input + '\n');// mando i dati al server pulsanteC = false;// posiziono a false perchè ora dovrò ricevere la risposta dal server //System.out.println("digita qualcos'altro o quit per uscire:"); }else{ Input =is.readLine();// leggo l'input da server (utilizzo l'altro stream di lettura) System.out.println("il serever ha risposto:" + "\n" + Input); pulsanteC = true;// rimetto il pulsante a true in modo da poter riusare l'altro stream di lettura System.out.println("rispondi al server o premi quit per uscire:"); } } System.out.println("sei uscito");//è sempre dal client che si esce is.close(); os.close(); socket.close(); } public static void main(String[] args) throws Exception { SocketClient client = new SocketClient(); client.start(); } } |