Witam Serdecznie.

Mam proszę Państwa problem. Muszę napisać prostą aplikacje klient serwer. Oto co ma robić ta aplikacja:

"Użytkownik otwiera okienko serwera, który oczekuje na połączenie od klientów. Po nawiązaniu połączenia (koniecznie każde w osobnym wątku), w okienku serwera można wybrać "radio-buttonem" jedną z komend:
-wyślij tekst (podany w polu tekstowym)
-rysuj kółko na zadanej pozycji
-odtwórz jakiś dźwięk
Po kliknięciu "wyślij komendę" serwer wysyła wszystkim klientom odpowiedni rozkaz. Klienci podłączeni do serwera oczekują na niego i gdy nadejdzie natychmiast go wykonują. Oczywiście obsługa rodzaju błędów musi być oparta na wyjątkach."

Zrobiłem w tej chwili taki niby komunikator przez który można wysyłać wiadomość. Poniżej zamieszczam kody:

Serwer


import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class serwer extends javax.swing.JFrame {

 
    public serwer() {
        initComponents();
    }

   
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        textArea1 = new java.awt.TextArea();
        jButton1 = new javax.swing.JButton();
        jTextField1 = new javax.swing.JTextField();
        jTextField2 = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("serwer");

        jButton1.setText("Wyślij");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                wyslij(evt);
            }
        });

        jTextField2.setText("192.168.1.100");

        jLabel1.setText("Napisz wiadomość");

        jLabel2.setText("Podaj adres IP");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(138, 138, 138)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 174, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(99, 99, 99)
                        .addComponent(jButton1)
                        .addGap(196, 196, 196))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel2)
                        .addContainerGap())
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addContainerGap())
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(jTextField1, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(textArea1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 454, Short.MAX_VALUE))
                        .addContainerGap())))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(textArea1, javax.swing.GroupLayout.PREFERRED_SIZE, 231, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(24, 24, 24)
                .addComponent(jLabel1)
                .addGap(5, 5, 5)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(11, 11, 11)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1))
                .addContainerGap(31, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void wyslij(java.awt.event.ActionEvent evt) {                        
       int port = 5500;
       String adresip = jTextField2.getText();
       String napis = jTextField1.getText();
       String wiadomosc = "";

       try {
          InetAddress servAddr = InetAddress.getByName(adresip);
          String data = napis;
          byte buf[] = data.getBytes();
          DatagramSocket socket = new DatagramSocket();
          DatagramPacket packet = new DatagramPacket(buf, buf.length, servAddr, port);
          socket.send(packet);
          wiadomosc=wiadomosc+"wyslano do: "+adresip+"wiadomosc "+napis+"\n";
          textArea1.setText("");
          jTextField1.setText("");
       }
       catch(Exception ex){
           System.err.println(ex);

       }

    }                       

 
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new serwer().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    private java.awt.TextArea textArea1;
    // End of variables declaration                   

}

Klient


import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class klient extends javax.swing.JFrame {

    public klient() {
        initComponents();
    }

   
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        textArea1 = new java.awt.TextArea();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Klient");

        jButton1.setText("Nasłuchuj");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                nasluchuj(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(98, 98, 98)
                .addComponent(textArea1, javax.swing.GroupLayout.PREFERRED_SIZE, 424, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(74, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(263, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addGap(260, 260, 260))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(25, 25, 25)
                .addComponent(textArea1, javax.swing.GroupLayout.PREFERRED_SIZE, 212, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(36, 36, 36)
                .addComponent(jButton1)
                .addContainerGap(57, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void nasluchuj(java.awt.event.ActionEvent evt) {                           
       int port = 5500;
       try{
           DatagramSocket socket = new DatagramSocket(port);
           while(true){
               byte[] buf = new byte[100];
               DatagramPacket packet = new DatagramPacket(buf, buf.length);
               socket.receive(packet);
               textArea1.setText("Dane odebrane ["+new String(packet.getData()).trim()+"]");


           }
       }
       catch(Exception e) {
           System.err.println(e);
       }
    }                          

   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new klient().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private java.awt.TextArea textArea1;
    // End of variables declaration                   

}

Mam teraz problem z pozostałą częścią projektu. Czy w ogóle to co napisałem do tej pory spełnia wymagania jakie mam postawione? Tzn te połączenia będą nawiązywane w osobnym wątku? I jak rozwiązać tą część z dźwiękiem i rysowaniem kółka? Niestety moja widza odnośnie javy nie jest zbyt wielka dlatego proszę Państwa o pomoc. Pod tym linkiem zamieściłem to co zrobiłem do tej pory (pliki): http://www.sendspace.pl/file/6248b4748ef5300fb90106f

Bardzo proszę o pomoc
Pozdrawiam.