Semplice chat in terminale in Java

Per entrare in un corso di ingegneria del software ho dovuto fare un piccolo homework di mezza giornata, una chat minimale scritta in java che permette di scambiarsi messaggi in rete tra due pc.

Ovviamente è molto semplice e non pretende di essere qualcosa di utile, ma se vi serve come spunto per imparare a usare i socket o i thread non è male.

Il progetto è composto di tre classi, Target (main), Server e Client. Si richiede ovviamente java installato sul pc per funzionare.

/**
@Class: TARGET
*/

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
public class Target {
public static void main(String[] args) throws IOException {

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
System.out.println(“\n\n\n\n*** Inserire ‘target’ se sei il server \noppure ‘target <host A>’ se sei il client. ***\n\n”);
String[] indirizzo = input.readLine().split(” “);
if (indirizzo[0].equals(“target”)) {
System.out.println(“\n\n*** Inserisci il tuo nick: ***\n”);
String nick = input.readLine();
System.out.println(“\n\n\n*** Ciao “+nick+”! Benvenuto nella chat. ***\n\n*** Digita /logout per uscire. ***\n”);
if (indirizzo.length==1){
InetAddress ip = InetAddress.getLocalHost();
System.out.print(“*** Il tuo ip locale e’ “);
System.out.println(ip.getHostAddress()+” ***”);
Server s = new Server(nick);
Thread rxs = new Thread(s);
rxs.start();
while(true) {
s.trasmetti();
}
}
else {
Client c = new Client(indirizzo[1], nick);
Thread rxc = new Thread(c);
rxc.start();
while(true) {c.trasmetti();}
}
}
else {
System.out.println(“\n\n*** Devi inserire ‘target’ o ‘target indirizzo’\ndove indirizzo e’ l’ip del server. ***”);
System.out.println(“\n*** Premere Invio per continuare. ***\n”);
BufferedReader reboot = new BufferedReader(new InputStreamReader(System.in));
reboot.readLine();
main(new String[0]);

}
}

}

/**
@Class: SERVER
*/

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

public class Server implements Runnable {
private ServerSocket server;
private Socket connessione;
private BufferedReader dalClient;
private PrintStream alClient;
private String name;
private String messaggio = “”;

public Server(String name) {
// Inizializzazione Server
this.name = name;
try {
server = new ServerSocket(1000, 5);
System.out.println(“\n*** Server attivo. In attesa del Client. ***”);
connessione = server.accept();
dalClient = new BufferedReader(new InputStreamReader(connessione.getInputStream()));
alClient = new PrintStream(connessione.getOutputStream());
}
catch(IOException e) {
System.out.println(e);
}
}

public void trasmetti() throws IOException {
// Attende la scrittura di un messaggio valido e la invia al Client
BufferedReader t = new BufferedReader(new InputStreamReader(System.in));
messaggio = t.readLine();
if(messaggio.length()>0) {
if(messaggio.equals(“/logout”)) {
System.out.println(“*** Arrivederci! ***”);
System.exit(0);
}
alClient.println(“* “+name+” scrive: “+messaggio);
}
}

public void run() {
//Thread parallelo in continua attesa di messaggi da ricevere
while(true) {
try {
messaggio = dalClient.readLine();
if(messaggio.length()>0) System.out.println(messaggio);
}
catch (IOException e) {
System.out.println(“*** Il Client si e’ disconnesso. ***”);
System.exit(0);
}
}
}

}

/**
@Class: CLIENT
*/

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

public class Client implements Runnable {
private Socket connessione;
private BufferedReader dalServer;
private PrintStream alServer;
private String name;
private String messaggio = “”;

public Client(String address, String nick) {
//Inizializzazione Client
this.name = nick;
try {
connessione = new Socket(address, 1000);
dalServer = new BufferedReader(new InputStreamReader(connessione.getInputStream()));
alServer = new PrintStream(connessione.getOutputStream());
}
catch(IOException e) {
System.out.println(e);
}
}

public void trasmetti() throws IOException {
// Attende la scrittura di un messaggio valido e la invia al Server
BufferedReader t = new BufferedReader(new InputStreamReader(System.in));
messaggio = t.readLine();
if(messaggio.length()>0) {
if(messaggio.equals(“/logout”)) {
System.out.println(“*** Arrivederci! ***”);
System.exit(0);
}
alServer.println(“* “+name+” scrive: “+messaggio);
}

}

public void run() {
//Thread parallelo in continua attesa di messaggi da ricevere
while(true) {
try {
messaggio = dalServer.readLine();
if(messaggio.length()>0) System.out.println(messaggio);
}
catch (IOException e) {
System.out.println(“*** Il Server si e’ disconnesso. ***”);
System.exit(0);
}
}
}
}