Rozłączenie gniazda w TCP

Rozłączenie gniazda w TCP
Kandif
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:231
0

Robię prosty programik, taki mini chat. Łącze klienta z serwerem po czym wymieniam informacje między nimi. Wszystko działa tylko mam problem bo chciałbym aby po wyłączeniu przez jednego z nich programu, drugiemu się wyświetliła prosta informacja o rozłączeniu rozmówcy, jednakże program mimo iż druga osoba sie rozłączyła nadal wydaje się połączony: client.isConnected() nadal zwraca true, a funkcja isClosed() false.

Gdy jeden klient kończy program wykonuję niniejsze instrukcje:

Kopiuj
public void Disconnect() throws IOException{
                client.shutdownInput();
                client.shutdownOutput();
                outp.close();
                inp.close();
                if(client!=null)client.close();
                if(server!=null)server.close();
            }

Powyższa metoda zawarta jest w klasie Poloczenie.

A to linijka która niby źle działa:

Kopiuj
if(!stan.client.isConnected()){
                dialog.setText(dialog.getText()+"\n"+stan.logint+" - został rozłączony"); 
                work=false;
            }else{
                try {
                    if(stan.inp.ready()){
                       cos = stan.Odbierz();
                    }
                } catch (IOException ex) {
                    Logger.getLogger(Chat.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

Te linijki są wykonywanie w drugim wątku tuż obok tego który odpowiada za interfejs (w swing).
Zaś stan to obiekt klasy Poloczenie, który posiada zarówno obiekt klasy SercerSocket (server) i Socket (client), a work to zmienna pętli drugiego wątku: "while(work)...". Obiekt inp to obiekt klasy BufferedReader pobierający strumień z sieci.

Błędów w kompilacji ani podczas uruchamiania nie ma a jednak nie działa jak powinno.
Podpowiedzcie i piszcie co ew. potrzebujecie aby my pomóc( co znaczy jaki element kodu ;)).


"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'
DI
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:9
1

Możesz np co 1-2 sec wysyłać jakiś pakiet który client musi odesłać i jesli server wyśle ten pakiet a client go nie odbierze to server sypnie wyjątkiem i w tym momencie możesz sam zamknąć połączenie i wyświetlić info ze user 1 rozłączył się :)

Kandif
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:231
0

Mało optymalne i wymagało by stworzenia nowego wątku.
Jakieś inne propozycje ? :(


"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'
Kandif
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:231
0

Udało mi się znaleźć starszy temat na tym forum o podobnym problemie i byłem zmuszony zrobić to w podobny sposób:

Kopiuj
if(stan.client.isConnected()){
                try {
                    if(stan.ready){
                       cos = stan.Odbierz();
                       if(cos==null){
                           work=false;
                           dialog.setText(dialog.getText()+"\n"+stan.loginj+" - został rozłączony");
                       } 
                    }
                } catch (IOException ex) {
                    Logger.getLogger(Chat.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

Link do tematu: Socket i zamkniecie polaczenia. .

A zasada działania polega na tym że gdy odebrany pakiet jest równy null wtedy przerywa . Pach i koniec.
A właśnie żeby nie było: metoda Odbierz zwraca String strumienia danych z gniazda drugiego użytkownika, piszę dla niejasności.


"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'

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.