Toon posts:

[JAVA] Sockets -> close connection probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben wat aan't experimenteren met ServerSockets/Sockets in Java. Ik heb een eenvoudige multithreaded server in elkaar gestoken en die werkt naar behoren... Ik heb echter 1 probleem:

Wanneer een client (die inlogd is via Telnet op de server) de verbinding op onverwachte manier beëindigd (=niet met een commando, maar gewoon z'n telnet app afsluit), dan begint m'n server te stressen (CPU 100%, en geheugenverbruik ook omhoog).

Nu zou je dit toch eenvoudig (?) moeten kunnen opvangen dacht ik... met een SocketException ofzo, maar dit blijkt niet te zijn.

Hier is een stukje van de code:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    public void run() {
     
        while (true) {       
            try {
                runServer = true;
                while(runServer){
                    String get = inlezenClientRequest();
                    doeIetsMetClientRequest(get); // runServer kan hier op false worden gezet.
                }
            }

            /* De client verbreekt onverwachts de verbinding -> hier opgevangen??? */
            catch (SocketException e) {
                e.printStackTrace();
                clientReset = true; //client finished communication
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            
            /* Beëindig de verbinding met de client. */       
            finally {
                if (!clientReset){
                    reply("server is terminating the connection...");
                    client.close();
                }
            }
        }
    }


Heb al verschillende sites bekeken waaronder die van Sun, maar niet echt iets gevonden.

Kan iemand mij hier in de goeie richting duwen met m'n probleem?

Owja, heb het getest op Win2000 met SDK 1.4.1

Verwijderd

Ik weet niet wat je in inlezenClientRequest() doet, maar als de functies die je daar aanroept nou geen exception throwen maar bijvoorbeeld '0' teruggeven heb je een probleem...

Verwijderd

Topicstarter
Verwijderd schreef op 12 juli 2004 @ 20:45:
Ik weet niet wat je in inlezenClientRequest() doet, maar als de functies die je daar aanroept nou geen exception throwen maar bijvoorbeeld '0' teruggeven heb je een probleem...
in de methode inlezenClientRequest() lees ik gewoon elke karakter dat doorgestuurd wordt... De return waarde is een String van die doorgestuurde karakters. Hier wordt inderdaad geen Exception geworpen.

Welke Exception zou ik hier dan moeten opvangen? Welke (karakter) waarde stuurt die Telnet app wanneer die 'onverwachts' afgesloten wordt (volgens mij geen... enkel een FIN op TCP niveau, maar hier kom je met de standaard SDK niet achter... of ben ik verkeerd)?

  • 12_0_13
  • Registratie: April 2004
  • Laatst online: 12-02 13:19
Hoe spring je uit de buitenste loop in je run-methode? Ikzelf doe altijd iets van

Java:
1
2
3
4
5
6
7
8
9
void run()
{
    boolean quit = false; //main loop exit control
    while(!quit)
    {
        //some interesting stuff takes place here.
        if (aap)  quit = true;
    }
}

[ Voor 15% gewijzigd door 12_0_13 op 13-07-2004 10:10 ]


  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 01-05 18:22

jAnO!

lalalavanillevla

Welke Exception zou ik hier dan moeten opvangen?
Je moet er juist één gooien. Of opvangen en hergooien. Of opvangen en een andere gooien etc....

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


  • 12_0_13
  • Registratie: April 2004
  • Laatst online: 12-02 13:19
In de inlezenClientRequest() kan ermisschien al een exceptie gevangen worden terwijl die eigenlijk had moeten worden doorgegooid, of op een andere manier worden afgevangen?

Kan je met een debugger/println's zien waar het programma is/heen gaat?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09:13

Janoz

Moderator Devschuur®

!litemod

Het lijkt me handig waneer je de source van de inlezenClientRequest(); methode hier post. Dat scheelt een heleboel gok werk.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Janoz schreef op 13 juli 2004 @ 11:52:
Het lijkt me handig waneer je de source van de inlezenClientRequest(); methode hier post. Dat scheelt een heleboel gok werk.
Ik heb het volgende geprobeerd en dit blijkt te werken:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    protected String inlezenClientRequest() throws IOException, SocketException{
        Reader in = new InputStreamReader(inputStream,"ASCII");
        StringBuffer res = new StringBuffer();
        boolean read = true;
                    
        while (read) {
            int c = in.read();
            
            /* Remote disconnect, end of stream has been reached. */
            if (c == -1)
                throw new SocketException("Remote disconnect!");
            
            if (c == '\r' || c == '\n')
                read = false;

            else if (c == '\b'){
                if (res.length() > 0)
                    res.deleteCharAt(res.length()-1);
            }

            else
                res.append((char) c);
        }
            
        return res.toString();
    }


Thanks for the input!
Pagina: 1