package test1; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * * @author Vallentin * @since April 8, 2012 * */ public class Server { public static int port = 2406; public static String ip = ""; public static ServerSocket server; public static ArrayList list_sockets = new ArrayList(); public static ArrayList list_client_states = new ArrayList(); public static ArrayList list_data = new ArrayList(); private static Runnable accept = new Runnable() { @Override public void run() { new Thread(send).start(); new Thread(receive).start(); while (true) { try { Socket socket = server.accept(); ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); String username = (String) ois.readObject(); boolean accepted = true; for (int i = 0; i < list_data.size(); i++) { if (list_data.get(i).username.toLowerCase().equals(username.toLowerCase())) { accepted = false; break; } } ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); if (accepted) { oos.writeObject("Welcome To This Server..."); list_clients_model.addElement(username + " - " + socket.getInetAddress().getHostAddress() + " - " + socket.getInetAddress().getHostName()); list_client_states.add(0); list_data.add(new DataPackage()); list_sockets.add(socket); } else { oos.writeObject("Your name is already taken!"); } } catch (Exception ex) {} } } }; private static Runnable send = new Runnable() { @Override public void run() { ObjectOutputStream oos; while (true) { for (int i = 0; i < list_sockets.size(); i++) { try { oos = new ObjectOutputStream(list_sockets.get(i).getOutputStream()); int client_state = list_client_states.get(i); oos.writeObject(client_state); oos = new ObjectOutputStream(list_sockets.get(i).getOutputStream()); oos.writeObject(list_data); if (client_state == 1) // Kicked by Server { disconnectClient(i); i--; } else if (client_state == 2) // Server Disconnected { disconnectClient(i); i--; } } catch (Exception ex) {disconnectClient(i);} } } } }; private static Runnable receive = new Runnable() { @Override public void run() { ObjectInputStream ois; while (true) { for (int i = 0; i < list_sockets.size(); i++) { try { ois = new ObjectInputStream(list_sockets.get(i).getInputStream()); int receive_state = (Integer) ois.readObject(); ois = new ObjectInputStream(list_sockets.get(i).getInputStream()); DataPackage dp = (DataPackage) ois.readObject(); list_data.set(i, dp); if (receive_state == 1) // Client Disconnected by User { disconnectClient(i); i--; } } catch (Exception ex) // Client Disconnected (Client Didn't Notify Server About Disconnecting) { disconnectClient(i); i--; } } } } }; public static void disconnectClient(int index) { try { list_clients_model.removeElementAt(index); list_client_states.remove(index); list_data.remove(index); list_sockets.remove(index); } catch (Exception ex) {} } public static JFrame frame; public static JPanel content; public static JPanel panel1; public static JPanel panel2; public static JPanel panel3; public static JButton btn_disconnect; public static JList list_clients; public static DefaultListModel list_clients_model; public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ex) {} try { ip = InetAddress.getLocalHost().getHostAddress() + ":" + port; server = new ServerSocket(port, 0, InetAddress.getLocalHost()); new Thread(accept).start(); } catch (IOException ex) { JOptionPane.showMessageDialog(null, "Error: " + ex.getMessage(), "Alert", JOptionPane.ERROR_MESSAGE); System.exit(0); } btn_disconnect = new JButton(); btn_disconnect.setText("Disconnect"); btn_disconnect.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int selected = list_clients.getSelectedIndex(); if (selected != -1) { try { list_client_states.set(selected, 1); } catch (Exception ex) { JOptionPane.showMessageDialog(null, "Error: " + ex.getMessage(), "Alert", JOptionPane.ERROR_MESSAGE); } } } }); list_clients_model = new DefaultListModel(); list_clients = new JList(list_clients_model); list_clients.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) { System.out.println(list_clients.getSelectedIndex()); } } }); frame = new JFrame(); frame.setTitle("Server - " + ip); frame.addWindowListener(new WindowListener() { public void windowActivated(WindowEvent e) {} public void windowClosed(WindowEvent e) {} @Override public void windowClosing(WindowEvent e) { while (list_sockets.size() != 0) { try { for (int i = 0; i < list_client_states.size(); i++) { list_client_states.set(i, 2); } } catch (Exception ex) {} } System.exit(0); } public void windowDeactivated(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowOpened(WindowEvent e) {} }); panel1 = new JPanel(); panel1.setLayout(new GridLayout(1, 1, 1, 1)); panel1.add(btn_disconnect); panel2 = new JPanel(); panel2.add(new JLabel(ip)); panel3 = new JPanel(); panel3.setLayout(new BorderLayout(1, 1)); panel3.add(panel1, BorderLayout.NORTH); panel3.add(new JScrollPane(list_clients), BorderLayout.CENTER); panel3.add(panel2, BorderLayout.SOUTH); content = new JPanel(); content.setLayout(new GridLayout(1, 1, 1, 1)); content.add(panel3); content.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); frame.setContentPane(content); frame.pack(); frame.setSize(350, 400); frame.setLocationRelativeTo(null); frame.setVisible(true); } }