Zápočet 26.1. 2012

Předmět zaměřený na praktické programování v jazyku a prostředí Java
Premun
Matfyz(ák|ačka) level I
Příspěvky: 7
Registrován: 6. 6. 2011 22:52
Typ studia: Informatika Mgr.

Zápočet 26.1. 2012

Příspěvek od Premun »

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

Kód: Vybrat vše

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

Kód: Vybrat vše

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));
        }
    }
}
Odpovědět

Zpět na „PGR013 Java“