Aplikacja klient-serwer - jak rozłączyć klienta?

0

Moja aplikacja składa się z serwera i klienta. Serwer obsługuje wielu klientów. Kiedy jakiś klient wyśle string do serwera, to serwer odsyła ten string do pozostałych klientów (oprócz tego klienta który nadesłał wiadomość).
Wszystko działa w porządku dopóki nie dochodzi do kwestii rozłączenia serwera i klienta. Klienta mam w osobnym oknie, i jak zamykam okno klienta krzyżykiem, serwer wyłapuje SocketException i wszystko gra. Ale mam problem z kontrolowanym rozłączeniem klienta.

Client.java

(...)
public void closeConnection()
    {
        isConnected = false;
    }
    
    @Override
     public void run()
     {
        try
        {
            while(isConnected)
            {
                String odp;

                if(isConnected == true)
                {
                    odp = in.readLine();
                    interf.jTextArea2.append(odp+"\n");
                }
                Thread.sleep(200);
            }

            System.out.println("Rozłączam...");
            in.close();
            out.close();
            klient.close();

        }
        catch (InterruptedException ex)
        {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (IOException ex)
        {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Gdy nacisnę przycisk "Rozłącz" wywołuję metodę closeConnection(). Jednak to w ogóle nie działa... Serwer nadal odbiera komunikaty od klienta jakby nic się nie stało :/ Chyba trzeba zacząć w ogóle od tego że mi się nie kończy pętla w run() ...
Mógłby ktoś pomóc? Dziękuję z góry :)</email>

0

Niech klient przed zamknięciem połączenia wyśle na serwer jakieś pożegnanie np. "by", serwer w odpowiedzi na pożegnanie też zamknie połączenie.

0

Watek wolajacy closeConnection() i watek w metodzie run() to dwa rozne watki, a uzywaja tej samej zmiennej closed. Czy ona jest volatile? Czy jak zmienisz na volatile to pomaga?

0

Sory, zmienned isConnected nie closed. Ale chodzi o to samo...

0

Dzięki poradziłam już sobie za pomocą metody który podał bo.
Ale teraz mam następne pytanie, gdyż mam zabezpieczyć tą aplikacjęi:

"- nastąpiła przerwa w działaniu sieci (timeouty przy wysyłaniu)".

Z tego co pisałam wcześniej serwer słucha, czy któryś z klientów nie przysłał komunikatu. Jeśli tak, to przekazuje go do wszystkich z wyjątkiem nadawcy. I teraz nie rozumiem dokładnie przy czym mam ustawić te timeouty i jak to dokładnie zrobić.

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