Avatar billede jonas_h Nybegynder
02. december 2007 - 23:05 Der er 11 kommentarer

Ang Sockets i en liste

Jeg har en datastruktur i java, hvor alle Sockets som er forbundet men stadig er i en slags "venteposition" er i en liste på serveren. Dvs. en klient kan godt være forbundet til en socket der er placeret i en liste. Mit problem er så, at hvis klienten disconnecter fra en socket i denne liste, ved jeg ikke hvor jeg fanger denne exception? Har også prøvet at lave en lille tråd som kører denne liste igennem indimellem, men det er som om, at alle sockets i listen ikke bliver registreret. "isConnected()" viser f.eks. altid true, selvom der er blevet disconnected...

Håber I forstår hvad jeg mener :) Det er lidt kringlet at forklare.. Hehe.
Avatar billede arne_v Ekspert
02. december 2007 - 23:07 #1
Det er faktisk ikke helt nemt at lave en god løsning på det problem.

En mulighed er at lade alle klienter sende en lille keepalive message hver
andet minut så så lade serveren gemme tidspunktet for den sidste.

SÅ er det nemt og løbe listen igennem og alle hvor tidspunktet er ældre end f.eks.
tre minutter kan så betragtes som døde.
Avatar billede jonas_h Nybegynder
02. december 2007 - 23:11 #2
Problemet er, at klienten er en vi har fået udleveret.. Vores opgave er at lave hele serveren og alle serverThreads.

Men så må jeg lave en helt anden struktur i serveren desværre. Synes bare ideen med at have et fixed antal serverThreads og så en connectionPool de kan finde nye connections i var rigtigt god.

Men hvordan kan det være man ikke får en IOException når man ser på den i listen hvor klienten har disconnectet? Gør man jo i alle andre tilfælde..
Avatar billede arne_v Ekspert
02. december 2007 - 23:17 #3
Hvordan skal serveren vide om den ikke modtager noget fordi client ikke sender noget
eller fordi client er forsvundet ?
Avatar billede jonas_h Nybegynder
02. december 2007 - 23:18 #4
En idé kunne måske være at udskrive en stream til klienten som fortæller ham, at han er i kø? Altså gøre det i den tråd som hele tiden checker listen igennem? På den måde vil man vel få smidt en IOException i hovedet når man prøver, og der ikke er forbindelse? Men ok, det er måske lidt irriterende for klienten at få en besked hele tiden...
Avatar billede arne_v Ekspert
02. december 2007 - 23:26 #5
Hvis du forsøger at skrive til klienten og han er væks, så får du en exception.
Avatar billede jonas_h Nybegynder
02. december 2007 - 23:49 #6
private void update()
    {
        BufferedReader in;
        BufferedInputStream in2;
        ArrayList arr = new ArrayList();
       
        for(Socket s : this.connectionPool)
        {
            try
            {
                in2 = new BufferedInputStream(s.getInputStream());
                in = new BufferedReader(new InputStreamReader(in2));
                String test = in.readLine();
                in2.close();
                in.close();
            }
            catch(IOException e)
            {
                arr.add(s);
                this.serverData.decrementConnectionsOpen();
            }
        }
        System.out.println(arr.size());
        this.connectionPool.removeAll(arr);
    }
Avatar billede jonas_h Nybegynder
02. december 2007 - 23:51 #7
Prøvede lige ovenstående hurtige løsning.. Det virker kun nogle gange :S Hvis der er 2 i connectionPool og jeg disconnecter én af dem, sker der intet. Disconnecter jeg derefter den sidste, bliver begge disconnectet på én gang. Ved ikke om det er fordi jeg glemmer noget synchronized et sted? Tvivler dog... Jeg er simpelthen forvirret nu.. Hehe.
Avatar billede arne_v Ekspert
03. december 2007 - 00:34 #8
er du opmærksom på at in.readLine() er blocking ??
Avatar billede jonas_h Nybegynder
03. december 2007 - 00:53 #9
Har jeg ikke lige tænkt over.. Men hvad ville du da gøre for at checke om der var forbindelse? Altså fra server til klient.I ovenstående metode
Avatar billede arne_v Ekspert
03. december 2007 - 00:57 #10
Hvis du ikke har kontrol over klient så du kan sende alive messages, så vil jeg nok
finde en thread per client attraktiv.
Avatar billede arne_v Ekspert
27. januar 2008 - 05:38 #11
jonas ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester