Simple Chat
SERVER
ChatServer
package server; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketAddress; import java.util.LinkedList; public class ChatServer { private LinkedList<ClientConnection> listaConnessioni = new LinkedList<ClientConnection>(); public synchronized SocketAddress getSocketAddressOfUser(int index) { ClientConnection user = listaConnessioni.get(index); return user.getSocketAddress(); } public synchronized void addConnessioni(ClientConnection u) { listaConnessioni.add(u); } public synchronized int getNumberOfConnection() { return listaConnessioni.size(); } public synchronized void sendBroadcastMSG(ClientConnection sender,String msg) { for(ClientConnection user: listaConnessioni) { if(user != sender) { user.sendMSG(msg); } } } public static void main(String[] args) { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(2893); } catch (IOException e) { e.printStackTrace(); } ChatServer chatServer = new ChatServer(); while(true) { Socket clientSocket = null; try { clientSocket = serverSocket.accept(); } catch (IOException e) { // TODO: handle exception e.printStackTrace(); } ClientConnection utente = new ClientConnection(clientSocket , chatServer); chatServer.addConnessioni(utente); utente.start(); } } }
ClientConnection
package server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.SocketAddress; public class ClientConnection extends Thread { private Socket clientSocket; private ChatServer chatServer; private PrintWriter out; private BufferedReader in; private InetAddress ip; private int portNumber; private SocketAddress socketAddress; public ClientConnection(Socket clientSocket, ChatServer chatServer) { // TODO Auto-generated constructor stub super(); this.clientSocket = clientSocket; this.chatServer = chatServer; ip = clientSocket.getInetAddress(); portNumber = clientSocket.getPort(); socketAddress = clientSocket.getRemoteSocketAddress(); } public int getPortNumber() { return portNumber; } public InetAddress getIP() { return ip; } public SocketAddress getSocketAddress() { return socketAddress; } public void sendMSG(String msg) { out.print(msg + "\r\n"); out.flush(); } public void run() { try { out = new PrintWriter(clientSocket.getOutputStream(), true); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // Stampa sullo standard output del Server l'indirizzo IP del nuovo utente connesso System.out.println("Indirizzo IP Client Connesso " + ip); // Invio al Client il messaggio di connessione al Server sendMSG("CONNECTED"); int numberOfConnection = chatServer.getNumberOfConnection(); String connectedIP = ""; SocketAddress a = null; for (int i = 0; i < numberOfConnection; i++) { a = chatServer.getSocketAddressOfUser(i); if(a != socketAddress) { connectedIP += a + "\n"; } } //invio al Client la lista degli utenti Connessi sendMSG(connectedIP); chatServer.sendBroadcastMSG(this,"ADDED " + socketAddress); while (true) { String fromClient = ""; try { fromClient = in.readLine(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (fromClient.startsWith("SEND")) { String msg = fromClient.substring(5, fromClient.length()); chatServer.sendBroadcastMSG(this,socketAddress+"@"+msg); } } } }
CLIENT
ChatClient
package client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class ChatClient { public static void main(String[] args) throws IOException { Socket chatSocket = null; PrintWriter out = null; BufferedReader in = null; try { chatSocket = new Socket("localhost", 2893); out = new PrintWriter(chatSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(chatSocket.getInputStream())); } catch (UnknownHostException e) { System.exit(1); } catch (IOException e) { System.exit(1); } BufferedReader userInputReader = new BufferedReader(new InputStreamReader(System.in)); String fromServer; while ((fromServer = in.readLine()) != null) { if (fromServer.equals("CONNECTED")) { System.out.println("Sono connesso con"); while(!((fromServer = in.readLine()).equals(""))) { System.out.println(fromServer); } // Faccio partire il Thread per Gestire l'input dell'utente ChatInputManager chatInputManager = new ChatInputManager(userInputReader,out); chatInputManager.start(); // Itero all'infinito stampando quello che il Server mi invia while(true) { fromServer = in.readLine(); if (fromServer.startsWith("ADDED")) { String[] serverMSG = fromServer.split(" "); System.out.println("Si e' aggiunto " + serverMSG[1]); } else { String[]msg = fromServer.split("@",2); System.out.println(msg[0] + " ha scritto:"); System.out.println(msg[1]); } } } } } }
ChatInputManager
package client; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; public class ChatInputManager extends Thread{ private BufferedReader userInputReader; private PrintWriter socketOutWriter; public ChatInputManager(BufferedReader userInputReader, PrintWriter socketOutWriter) { // TODO Auto-generated constructor stub this.userInputReader = userInputReader; this.socketOutWriter = socketOutWriter; } public void run() { while(true) { String fromUser = ""; try { fromUser = userInputReader.readLine(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } socketOutWriter.print(fromUser + "\r\n"); socketOutWriter.flush(); } } }