Auf Thema antworten

[code=Java]

socket = serverSocket.accept();

socket.getRemoteSocketAddress(); // liefert die IP und den Port des Clients, der sich mit dem Server verbunden hat

[/code]


Jetzt wird das mit der JList alles ein klein wenig komplizierter, denn jetzt musst der JList nicht einfach nur einen Wert geben, sondern ein Objekt, welches mehrere Werte beinhaltet (IP und Progress). Ein Objekt deswegen, weil ja IP und Progress in Relation stehen.



Aber möglich ist das alles, irgendwie ;)


[code=Java]

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Component;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;


import javax.swing.DefaultListCellRenderer;

import javax.swing.DefaultListModel;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JList;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JProgressBar;

import javax.swing.JScrollPane;


public class ServerClientDemo {


    public ServerClientDemo() {

        new Thread(new Runnable() {

            public void run() {

                new Server().start();

            }

        }).start();

        System.out.println("Server started");

        for (int i = 0; i < 10; i++) {

            try {

                Thread.sleep((long) (Math.random() * 2000));

                new Client().start();

                System.out.println("Client started");

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    }


    class Server {

        private GUI        gui;

        private int        clientIndex;

        private Socket    socket;


        public void start() {

            gui = new GUI();

            clientIndex = 0;

            try {

                ServerSocket serverSocket = new ServerSocket(5555);

                while (true) {

                    socket = serverSocket.accept();

                   

                    gui.addClient(new ServerClientObject(0, socket.getRemoteSocketAddress().toString()));

                   

                    new Thread(new Runnable() { // Thread zum Empfangen der

                                                // Statusmeldungen

                                private int    index    = clientIndex++;

                                private int    status    = 0;


                                public void run() {

                                    try {

                                        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                                        String in;

                                        while ((in = reader.readLine()) != null)

                                            Server.this.setStatus(index, Integer.parseInt(in));

                                    } catch (Exception exc) {

                                        exc.printStackTrace();

                                    }

                                }

                            }).start();

                }

            } catch (Exception exc) {

                exc.printStackTrace();

            }

        }


        public void setStatus(int i, int status) {

            gui.setStatus(i, status);

        }


        class GUI extends JFrame {

            private DefaultListModel    model;

            private JList list;

           

            public GUI() {

                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

               

                list = new JList(model = new DefaultListModel());

               

                list.addMouseListener(new MouseAdapter() {

                    @Override

                    public void mouseClicked(MouseEvent e) {

                        if (e.getClickCount() == 2){

                            JOptionPane.showMessageDialog(GUI.this, "selektierter Index: " + list.getSelectedIndex());

                        }

                    }

                });

               

                list.setCellRenderer(new DefaultListCellRenderer() {

                   

                    private JProgressBar    bar    = new JProgressBar();

                    private JLabel             label = new JLabel();

                    private JPanel             panel = initPanel();

                   

                    private Color defaultForground = bar.getForeground();

                    private Color defaultBackground = bar.getBackground();                   

                   

                    private JPanel initPanel() {

                        JPanel panel = new JPanel(new BorderLayout());

                       

                        panel.add(label,     BorderLayout.WEST);

                        panel.add(bar,         BorderLayout.CENTER);

                       

                        return panel;

                    }


                    public Component getListCellRendererComponent(JList list, final Object value, int index, boolean isSelected, boolean cellHasFocus) {

                        /*

                         * Da wir dem Model nun nicht mehr einfache Werte übergeben (0-100) sondern ein

                         * Objekt, müssen wir die Variable "value" casten.

                         */

                        ServerClientObject sco = (ServerClientObject) value;

                       

                        bar.setValue(sco.getProgress());

                        bar.setStringPainted(true);

                       

                        label.setText(sco.getAddress());

                       

                        if (isSelected){

                            bar.setForeground(Color.RED);

                            bar.setBackground(new Color(255,200,200));

                        }else{

                            bar.setForeground(defaultForground);

                            bar.setBackground(defaultBackground);

                        }

                       

                        return panel;

                    }

                });

                this.getContentPane().add(new JScrollPane(list));

                this.setBounds(0, 0, 200, 200);

                this.setLocationRelativeTo(null);

                this.setVisible(true);

            }


            public void addClient(ServerClientObject serverClientObject) {

                model.addElement(serverClientObject);

            }


            public void setStatus(int index, int status) {

                ((ServerClientObject)model.getElementAt(index)).setProgress(status);

                list.validate();

                list.repaint();

            }

        }

       

        class ServerClientObject{

            private int progress;

            private String address;

           

            public ServerClientObject(int progress, String address) {

                this.progress = progress;

                this.address = address;

            }

            public void setProgress(int progress) {

                this.progress = progress;

            }

            public int getProgress() {

                return this.progress;

            }

            public void setAddress(String address) {

                this.address = address;

            }

            public String getAddress() {

                return this.address;

            }

        }

    }


    class Client {

        public void start() throws Exception, IOException {

            final Socket socket = new Socket("127.0.0.1", 5555);

            final PrintWriter writer = new PrintWriter(socket.getOutputStream());

           

            new Thread(new Runnable() {

                int    status    = 0;


                public void run() {

                    while (status <= 100) {

                        try {

                            Thread.sleep((long) (Math.random() * 5000));

                        } catch (InterruptedException e) {

                            e.printStackTrace();

                        }

                        writer.println(status);

                        writer.flush();

                        status += 10;

                    }

                }

            }).start();

        }

    }


    public static void main(String[] args) {

        new ServerClientDemo();

    }

}

[/code]



Oben