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();
}

}

Tutorial inserito da berserk80

 
fotoprofilo