Ciao![]()
Qual'è un metodo semplice per inviare in broadcast un messaggio che scrive un utente in una chat? Ho trovato vari codici a riguardo, ma troppo complessi per i miei scopi.
Sotto posto il codice che ho provato a modificare, è semplice ma non invia il testo a tutti gli utenti connessi, solo all'utente di cui si specifica il nome. Ho iniziato facendo un ciclo for, conto il numero di coppie nick-valore presenti nella hashMap. Vorrei che il messaggio venga letto da tutti i clienti presenti nella hashMap. Ma non funziona![]()
Premetto che non sono molto capace a programmare in java, ho iniziato da poco!
codice:import java.net.ServerSocket; import java.net.Socket; import java.io.*; import java.util.*; public class ChatServerT { private static int port = 8888; public static void main (String[] args) throws IOException { ServerSocket server = null; try { server = new ServerSocket(port); } catch (IOException e) { System.err.println("Could not listen on port: " + port); System.err.println(e); System.exit(1); } Socket client = null; while(true) { try { client = server.accept(); } catch (IOException e) { System.err.println("Accept failed."); System.err.println(e); System.exit(1); } Thread t = new Thread(new ClientConn(client)); t.start(); } } } // End class ChatServerT class ChatServerProtocol { private String nick; private ClientConn user; private static HashMap<String, ClientConn> nicks = new HashMap<String, ClientConn>(); private static final String msg_OK = "OK"; private static final String msg_NICK_IN_USE = "NICK IN USE"; private static final String msg_SPECIFY_NICK = "SPECIFY NICK"; private static final String msg_SEND_FAILED = "FAILED TO SEND"; private static boolean add_nick(String nick, ClientConn c) { if (nicks.containsKey(nick)) { return false; } else { nicks.put(nick, c); return true; } } public ChatServerProtocol(ClientConn c) { nick = null; user = c; } private void log(String msg) { System.err.println(msg); } public boolean isAuthenticated() { return ! (nick == null); } private String authenticate(String msg) { if(msg.startsWith("NICK")) { String tryNick = msg.substring(5); if(add_nick(tryNick, this.user)) { log("Nick " + tryNick + " joined."); this.nick = tryNick; return msg_OK; } else { return msg_NICK_IN_USE; } } else { return msg_SPECIFY_NICK; } } // Invia un messaggio in broadcast private boolean sendMsg(String recipient, String msg) { if (nicks.containsKey(recipient)) { int e = nicks.size(); for(int i=0;i<e;i++){ ClientConn c = nicks.get(recipient); c.sendMsg(nick + ": " + msg); } return true; } else { return false; } } // l'input del cliente viene processato public String process(String msg) { if (!isAuthenticated()) return authenticate(msg); String[] msg_parts = msg.split(" ", 2); if(sendMsg(msg_parts[0], msg_parts[0])) return msg_OK; else return msg_SEND_FAILED; } } // End class ChatServerProtocol class ClientConn implements Runnable { private Socket client; private BufferedReader in = null; private PrintWriter out = null; ClientConn(Socket client) { this.client = client; try { in = new BufferedReader(new InputStreamReader(client.getInputStream())); out = new PrintWriter(client.getOutputStream(), true); } catch (IOException e) { System.err.println(e); return; } } public void run() { String msg, response; ChatServerProtocol protocol = new ChatServerProtocol(this); try { while ((msg = in.readLine()) != null) { response = protocol.process(msg); out.println("SERVER: " + response); } } catch (IOException e) { System.err.println(e); } } public void sendMsg(String msg) { out.println(msg); } } // End class ClientConn

Rispondi quotando