# Zápočet 26.1. 2012

<{ForumPost(poster="Premun", timestamp=2012-01-26 11:55:52)}>
Dneska byl celkem easy ukol: SyncListClient.  
Nechal nam tam bezet server a vy jste meli udelat klienta - oknovou aplikaci ve swingu, ktery se tam pripoji (podle parametru z argumentu - server, port).  
Ten mel za ukol umet pridat zaznam (radka textu) a odeslat na server. Server pak poslal vsem pripojenym klientum tu radku a ty ji meli zobrazit.  
Pak melo jit zaznam vymazat (zase se smazal vsem klientum pres server).  
Dal jeste server informoval klienty o poctu pripojenych lidi, tak to se tam taky melo zorbazovat.  
Zaznamy byly zobrazovany v JListu.  
  
Dalsi pozadavky: Predepsany vzhled, GridBagLayout, synchronizace vlaken, spustit z jaru..  
  
Kdyby nekdo chtel muj fugly kod, tak:  
Main.java

    package zapoctovy_test;
    
    import java.awt.Dimension;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.*;
    
    public class Main {
    
        private static Client client;
        private static JLabel clientCount;
        private static JTextField text;
        private static final DefaultListModel model = new DefaultListModel();
    
        public static void main(String[] args) {
            if(args.length != 2) {
                JOptionPane.showMessageDialog(null, "Wrong number of arguments.");
                return;
            }
    
            int port;
            try {
                port = Integer.parseInt(args[1]);
            } catch(Exception e) {
                JOptionPane.showMessageDialog(null, "Port is invalid.");
                return;
            }
    
            client = new Client(args[0], port);
    
            SwingUtilities.invokeLater(new Runnable() {
    
                public void run() {
                    okno();
                    client.start();
                }
            });    
        }
    
        private static void okno() {
            JFrame frame = new JFrame("SyncList Client");
            JFrame.setDefaultLookAndFeelDecorated(true);
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JPanel main = new JPanel(new GridBagLayout());
            main.setPreferredSize(new Dimension(250, 400));
    
    // MAIN PANEL
            GridBagConstraints c = new GridBagConstraints();
            c.gridheight = 1;
            c.gridx = 0;
            c.gridy = 0;
            c.gridwidth = 2;
            c.weightx = 1.0;
            c.fill = GridBagConstraints.HORIZONTAL;
            c.insets = new Insets(1, 1, 1, 1);
    
    
     // NUM OF CLIENTS
            clientCount = new JLabel("Number of clients: 0");
            main.add(clientCount, c);
    
    
    // TEXTFIELD
            text = new JTextField();
            text.setPreferredSize(new Dimension(180, 30));
            text.addKeyListener(new KeyListener() {
    
                public void keyTyped(KeyEvent e) {}
    
                public void keyPressed(KeyEvent e) {
                    if(e.getKeyCode() == 10) {
                        client.send("ADD " + text.getText());
                        text.setText(null);
                    }
                }
    
                public void keyReleased(KeyEvent e) {}
            });
    
            c.gridy = 1;
            c.gridwidth = 1;
            main.add(text, c);
    
    
    
    // ADD BUTTON
            JButton add = new JButton("ADD");
            add.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    client.send("ADD " + text.getText());
                    text.setText(null);
                }
            });
    
            c.gridx = 1;
            c.weightx = 0.0;
            main.add(add, c);
    
    
    // JLIST
            c.gridx = 0;
            c.gridy = 2;
            c.gridwidth = 2;
            c.fill = GridBagConstraints.BOTH;
            c.weighty = 1.0;
            c.weightx = 1.0;
    
            final JList messages = new JList(model);
    
            main.add(messages, c);
    
    
    // DELETE BUTTON
            c.gridy = 3;
            c.weighty = 0.0;
            c.fill = GridBagConstraints.HORIZONTAL;
            JButton delete = new JButton("DELETE SELECTED ITEM");
            delete.addActionListener(new ActionListener() {
    
                public void actionPerformed(ActionEvent e) {
                    String item = (String) messages.getSelectedValue();
    
                    if(!item.isEmpty()) {
                        client.send("DEL " + item);
                    }
                }
            });
    
            main.add(delete, c);
    
            frame.getContentPane().add(main);
    
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void setClients(String s) {
            clientCount.setText("Number of clients: " + s);
        }
    
        public static void addMessage(String msg) {
            synchronized(model) {
                model.addElement(msg);
                System.out.println(msg);
            }
        }
    
        public static void deleteMessage(String msg) {
            synchronized(model) {
                for(int i = 0; i < model.size(); ++i) {
                    if(model.elementAt(i).equals(msg)) {
                        model.removeElementAt(i);
                        break;
                    }
                }
            }
        }
    
        public static void exit() {
            System.exit(0);
        }
    }
    

Client.java

    package zapoctovy_test;
    
    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 javax.swing.JOptionPane;
    
    public class Client extends Thread {
    
        private Socket socket;
        private PrintWriter out;
        private BufferedReader in;
        private String server;
        private int port;
    
        public Client(String s, int p) {
            port = p;
            server = s;
        }
    
        @Override
        public void run() {
            try {
                socket = new Socket(InetAddress.getByName(server), port);
    
                try {
                    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    out = new PrintWriter(socket.getOutputStream());
    
                    String msg;
    
                    while(true) {
                        msg = in.readLine();
                        process(msg);
                    }
    
                } catch(IOException e) {
                    JOptionPane.showMessageDialog(null, "Disconnected: " + e.getMessage());
                Main.exit();
    
                } finally {
                    socket.close();
                }
    
            } catch(IOException e) {
                JOptionPane.showMessageDialog(null, "Server not found: " + e.getMessage());
                Main.exit();
            }
        }
    
        void send(String text) {
            if(text.isEmpty()) return;
    
            try {
                out.println(text);
                out.flush();
                
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Disconnected. Sending message failed.");
                Main.exit();
            }
        }
    
        private void process(String msg) {
            int pos = msg.indexOf(' ');
    
            if(pos == -1) JOptionPane.showMessageDialog(null, "-1: " + msg);
    
            String cmd = msg.substring(0, pos);
    
            if(cmd.equals("CLIENTS")) {
                Main.setClients(msg.substring(pos + 1));
            } else if(cmd.equals("ADD")) {
                Main.addMessage(msg.substring(pos + 1));
            } else if(cmd.equals("DEL")) {
                Main.deleteMessage(msg.substring(pos + 1));
            }
        }
    }
    


<{/ForumPost}>

