pętle w aplikacjach okienkowych

0

witam ponownie, napotkałem kolejny problem

czy istnieje możliwość, aby moja aplikacja w pętli nasłuchiwała przychodzących połączeń klientów ?
mam główny textArea, w którym pojawiają się różne informacje (np. gniazdko zostało stworzone, port nasłuchiwania to 666)
chciałbym aby tam te informacje pojawiały się na bieżąco (np. użytkownik "józek" się podłączył)

mam otóż taką pętelkę:

do
{
    new watekKlienta(serverSock.accept());
}
while(serverRunning);

w aplikacji konsolowej działa to bez zarzutu
ale w aplikacji okienkowej całość się "zawiesza" :)

jak tego typu pętle implementuje się w okienkowych aplikacjach ?

0

w osobnym wątku

0

AWT ma swój jeden wątek... i rysowanie i rozdzielanie zdarzeń odbywa się w nim...
Myk jest taki, że wszelkie listenery też odpalane są w nim - zatem jak w listerze go przyblokujesz, to przyblokujesz wszystko

0

no to odniosę się do szczegółów zatem, bo kombinuję z wątkiem i mam dokładnie to samo

jest metoda StartSerwer

public void StartSerwer() throws IOException
{                
    try
    {
        serverSock = new ServerSocket(port, backlog, bindAddr);            
    }
    catch (IOException ioex)
    {
        SerwerForm.textLog.append(ioex.getMessage());
    }
    WatekKlienta watekKlienta = new WatekKlienta(serverSock.accept());
}

to jest klasa Serwer której obiekt jest wytworzony wcześniej w klasie nadrzędnej SerwerForm
zaś WatekKlienta to coś takiego na chwilę obecną najprostszego

class WatekKlienta extends Thread
{
    Socket clientSock;
    
    WatekKlienta(Socket clientSock)
    {
        this.clientSock = clientSock;
        start();
    }
    
    @Override public void run()
    {
        try
        {
            PrintWriter out = new PrintWriter(clientSock.getOutputStream(), true);
            BufferedReader in = new BufferedReader( new InputStreamReader(clientSock.getInputStream()));
            
            String outputLine, currUser;
            
            outputLine = "Witaj, podaj swoje imię:\n";
            out.println(outputLine);
            
            currUser = in.readLine();
            
            SerwerForm.textLog.append("Wątek klienta uruchomiony: podłączony \n"+currUser);
        }
        catch (IOException ioex)
        {
            KokoSerwerForm.textLog.append(ioex.getMessage());
        }
    }
}

i mam nadal freeze :P

pomożecie ?

0

zamiast

 WatekKlienta(Socket clientSock)
    {
        this.clientSock = clientSock;
        start();
    }

Rób:

 WatekKlienta(Socket clientSock)
    {
        this.clientSock = clientSock;
    }

W momencie tworzenia wątku nie uruchamiaj go ręcznie, ale wykorzystaj Executor:

Executor executor = Executors.newCachedThreadPool();
		executor.execute(new WatekKlienta(new Socket("localhost", 8080)));

który będzie tworzony raz w ramach aplikacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1