import java.awt.*; import java.awt.event.*; import java.io.IOException; import java.net.*; import java.util.*; import javax.swing.*; /** * Ip 4.1.2 * @author emi-lind * */ public class ChatServer extends JFrame { private int _port; private ServerSocket _serverSocket; private JTextArea _outputArea; /** * Stores all clients connected */ private ArrayList _allClients; private String _jFrameTitle; /** * @param args Port */ public static void main(String[] args) { new ChatServer(args); } private ChatServer(String[] aArgs) { this.readCommandLineArgs(aArgs); this.createGUI(); this.initServer(); } /** * Reads the command line * @param aArgs */ private void readCommandLineArgs(String[] aArgs) { int port = 2000; if (aArgs.length > 0) { port = Integer.parseInt(aArgs[0]); } _port = port; } /** * Creates the gui */ private void createGUI() { _jFrameTitle = "Server Chat v1.0."; setVisible(true); setSize(600, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); _outputArea = new JTextArea(); _outputArea.setEditable(false); JScrollPane outScroll = new JScrollPane(_outputArea); // Auto scroll outScroll.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { @Override public void adjustmentValueChanged(AdjustmentEvent e) { e.getAdjustable().setValue(e.getAdjustable().getMaximum()); } }); add(outScroll, BorderLayout.CENTER); validate(); } /** * Starts and runs the server */ private void initServer() { _allClients = new ArrayList(); try { showMessage("Starting server on port: " + _port, false); _serverSocket = new ServerSocket(_port); _jFrameTitle += " HOST: " + _serverSocket.getInetAddress().getLocalHost().getHostName() + " IP: " + _serverSocket.getInetAddress().getLocalHost().getHostAddress() + " ON PORT: " + _port + " CLIENTS: "; setTitle(_jFrameTitle + "0"); while (true) { Socket connection = _serverSocket.accept(); // Waits for connection showMessage("Connection established with " + connection.getInetAddress() + " on port " + connection.getPort(), false); ClientHandler ch = new ClientHandler(this, connection); _allClients.add(ch); setTitle(_jFrameTitle + " CLIENTS: " + _allClients.size()); } } catch (IOException e) { showMessage(e.toString(), true); } } /** * Prints a message or an error message in System.err or out and in the output. * @param aErrorMessage The message to print * @param aIsError If the message is an error */ public void showMessage(String aMessage, boolean aIsError) { if (aIsError) { System.err.println(aMessage); this._outputArea.append("ERROR: " + aMessage+ "\n"); } else { System.out.println(aMessage); this._outputArea.append(aMessage + "\n"); } } /** * Broadcasts a message to all connected users * @param aMessage The message */ public synchronized void broadcastMessageToAllClients(String aMessage) { for (ClientHandler ch : _allClients) { ch.sendMessage(aMessage); } } /** * Kills a ClientHandler. Does nothing if given ClientHandler doesn't exist * @param aClient the client to kill */ public synchronized void killClientHandler(ClientHandler aClient) { if( _allClients.remove(aClient)) { setTitle(_jFrameTitle + " CLIENTS: " + _allClients.size()); aClient.killThread(); } } }