pętle w aplikacjach okienkowych

pętle w aplikacjach okienkowych
SH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
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ę:

Kopiuj
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 ?

Misiekd
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7923
0

w osobnym wątku

Kerai
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: London
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

SH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
0

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

jest metoda StartSerwer

Kopiuj
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

Kopiuj
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 ?

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6823
0

zamiast

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

Rób:

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

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

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

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.