Witam. Pomyślałem że najlepiej nauczyć się tego pakietu ćwicząc, postanowiłem więc napisać prosty komunikator internetowy. Mam jednak problem. Mój program składa się z dwóch plików: Komunikator i OknoRozmowy. W klasie Komunikator nasłuchuje serwer, w razie połączenia tworzy nowy obiekt klasy OknoRozmowy przekazując mu w konstruktorze Socket uzyskany z metody accept serwera, oprucz tego z tej klasy można również zainicjować połączenie przez stworzenie obiektu Socket i przekazanie go do konstruktora. Poniżej te klasy:

Klasa Komunikator
< code = java >
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.;
import java.util.
;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.;
import java.awt.
;
public class Komunikator extends JFrame
{
public Komunikator()
{
super("Nasz komunikator");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
setSize(200, 400);
panel = new JPanel();
panel.setLayout(new FlowLayout());
polaczPrzyc = new JButton("polacz");
polaczPrzyc.addActionListener(new Polaczenie());
panel.add(polaczPrzyc);
ip = new JTextField(10);
panel.add(ip);
add(panel);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new Komunikator();
}
});
//while(0 == 0)
// {
try
{
serv = new ServerSocket(6700);
final Socket a = serv.accept();
new Thread()
{
public void run()
{
try {

                    new OknoRozmowy(a);
                } catch (IOException ex) {
                   ex.printStackTrace();
                }
                        }
                    }.start();
                  //  serv.close();
                //    serv = new ServerSocket(6700);
                }catch (Exception ex)
                {
                    JOptionPane.showMessageDialog(null, "Wystapil blad przy probie polaczenia: (tworzenie servera)" + ex.toString());
                    ex.printStackTrace();
  //                  break;
                }
  //  }
}
class Polaczenie implements ActionListener
{

    public void actionPerformed(ActionEvent e) 
    {
        new Thread()
        {
            public void run()
            {
        try
        {
            new OknoRozmowy(new Socket(ip.getText(), 6700));
        }catch (Exception ee)
        {
            JOptionPane.showMessageDialog(null, "Wystapil blad przy probie polaczenia (Wzwalacz polaczenie)" + ee.getMessage());
        }
            }}.start();
    }
    
}
private static ServerSocket serv;
private static Socket gniazdo;
private static JPanel panel;
private static JButton polaczPrzyc;
private static JTextField ip; 

}
< /code = java >

Klasa OknoRozmowy
< code = java >
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.util.;
import javax.swing.
;
import java.awt.;
import java.awt.event.ActionListener;
import java.awt.event.WindowListener;
import java.io.
;
import java.net.*;
public class OknoRozmowy extends JFrame
{
public OknoRozmowy(Socket soc) throws IOException
{
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setVisible(true);
setSize(300, 200);
panel = new JPanel();
panel.setLayout(new FlowLayout());
rozmowa = new JTextArea(5, 20);
rozmowa.setBounds(5, 5, 50, 50);
panel.add(rozmowa);
mojaWiadomosc = new JTextField(20);
wyslij = new JButton("Wyslij");
wyslij.addActionListener(new Wyslij());
panel.add(mojaWiadomosc);
panel.add(wyslij);
add(panel);
//addWindowListener(new Otwarty());
gniazdo = soc;
new Thread()
{
public void run()
{
sluchaj();
}
}.start();

}
public void sluchaj()
{
    System.out.println("pierwsz punkt");
    try
    {
        wejscie = new BufferedReader(new InputStreamReader(gniazdo.getInputStream()));
        wyjscie = new DataOutputStream(gniazdo.getOutputStream());
        System.out.println("Drugi punkt");
        for(String wiadomosc = wejscie.readLine() ;  0 == 0 ; wiadomosc = wejscie.readLine())
        {
            System.out.println("trzeci");
            rozmowa.append(wiadomosc);
            System.out.println(wiadomosc);
            System.out.println("czwarty");
            //wiadomosc = null;
        }
    }catch (IOException e)
    {
        JOptionPane.showMessageDialog(null, "Wystapil blad polaczenia(sluchaj) " + e.getMessage());
    }    
}
class Wyslij implements ActionListener
{
    public void actionPerformed(ActionEvent e) 
    {
        try
        {
            wyjscie.writeBytes(mojaWiadomosc.getText());
            rozmowa.append(mojaWiadomosc.getText());
        }catch (IOException ex)
        {
            JOptionPane.showMessageDialog(rootPane, "Nastapil blad wyslania wiadomosc" + ex.getLocalizedMessage());
        }
        
    }
}
class Otwarty implements WindowListener
{

    public void windowOpened(WindowEvent e) 
    {
        
    }

    public void windowClosing(WindowEvent e) {
        
    }

    public void windowClosed(WindowEvent e) {
        
    }

    public void windowIconified(WindowEvent e) {
        
    }

    public void windowDeiconified(WindowEvent e) {
        
    }

    public void windowActivated(WindowEvent e) {
        
    }

    public void windowDeactivated(WindowEvent e) {
        
    }
    
}

private static Socket gniazdo; 
private static JTextArea rozmowa;
private static BufferedReader wejscie;
private static DataOutputStream wyjscie;
private static JPanel panel;
private static JTextField mojaWiadomosc;
private static JButton wyslij;

}
< /code = java >

Kiedy łączę się z klientem przez telnet wszystko jest w porządku otwiera się okienko rozmowy klienta i przesyłane wiadomości są widoczne. Testowałem ten program z dziewczyną, kiedy próbowała połączyć sie za pomocą tego komunikatora zamiast telnetu obojgu nam otwierały się okienka rozmowy (więc połączenie zostało nawiązane) ale przesyłane wiadomości nie były widoczne. Jaka może być tego przyczyna? Przeciez te okienka bez względu na to czy nasłuchiwałęm czy odezwałem się pierwszy działają identycznie.
Z góry dziękuję za pomoc i pozdrawiam.