Toon posts:

[java] Socket conection lost

Pagina: 1
Acties:

Verwijderd

Topicstarter
hallo,

ik heb in java een chatserver gemaakt een server applicatie en een client applicatie

als ik de chatserver afsluit krijg ik op de client een exception waardoor ik de client applicatie kan laten beeindigen met een popupje en een melding erin

als de client zijn netwerkverbinding verbreekt krijgt de client wel een melding dat de server onbereikbaar is maar op de server is hier niets van bekend. na verloop van tijd word de client socket wel gesloten maar dit is waarschijnlijk een timeout

de client moet dan uitgelogd worden in een database maar omdat de server niet weet dat de client weg is gebeurt dit ook nie daardoor

is er nog een andere manier om te detecteren of een socket verbinding nog bestaat of een manier om te detecteren dat de client weg is?

Verwijderd

Een simpele manier is natuurlijk vanuit de server een timertje die elke 10 (ofzo) seconden een "PING" stuurt, en dat de client "PONG" terug stuurt.
Of je kan natuurlijk gewoon wachten op de timeout, die uiteindelijk toch wel komt.

Verwijderd

als er een bericht wordt gestuurd merkt de server toch dat de socket weg is. Dan kan je toch de exception opvangen en de client uit de database flikkeren?

of begrijp ik je verkeerd

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Je hoort gewoon netjes in je chatprotocol een signoff procedure te genereren. Ik ken de Java-implementatie van sockets niet maar vind het wel correct dat je gewoon een exception om je oren krijgt als je een lost connection probeert te benaderen.

Dat gezegd hebbende zal er wel degelijk een nette manier zijn om het te checken :)

Professionele website nodig?


Verwijderd

Topicstarter
Verwijderd schreef op 28 October 2003 @ 12:59:
Een simpele manier is natuurlijk vanuit de server een timertje die elke 10 (ofzo) seconden een "PING" stuurt, en dat de client "PONG" terug stuurt.
Of je kan natuurlijk gewoon wachten op de timeout, die uiteindelijk toch wel komt.
dit zou inderdaad een optie zijn maar veroorzaakt een hoop netwerkverkeer zeker als je het hebt over een applicatie die voor honderde gebruikers geschikt moet zijn
Verwijderd schreef op 28 October 2003 @ 13:01:
als er een bericht wordt gestuurd merkt de server toch dat de socket weg is. Dan kan je toch de exception opvangen en de client uit de database flikkeren?

of begrijp ik je verkeerd
dat is juist het probleem er doet zich geen exception voor als de server een berichtje stuurt naar een client die niet meer bestaat

wat ik me dus afvroeg of er geen manier is om via de socket op te vragen of de client nog leeft

Verwijderd

Topicstarter
curry684 schreef op 28 October 2003 @ 13:06:
Je hoort gewoon netjes in je chatprotocol een signoff procedure te genereren. Ik ken de Java-implementatie van sockets niet maar vind het wel correct dat je gewoon een exception om je oren krijgt als je een lost connection probeert te benaderen.

Dat gezegd hebbende zal er wel degelijk een nette manier zijn om het te checken :)
ik het protocol heb ik idd een logoff procedure zitten die werkt ook prima maar als om een of andere manier de verbinding met de client verbroken word (bijvoorbeeld de netwerkkabel eruit halen) dan krijg ik dus geen exception..

Verwijderd

Verwijderd schreef op 28 October 2003 @ 13:07:
dat is juist het probleem er doet zich geen exception voor als de server een berichtje stuurt naar een client die niet meer bestaat

wat ik me dus afvroeg of er geen manier is om via de socket op te vragen of de client nog leeft
is het een optie om ieder client bij het ontvangen van een bericht een bericht terug te laten sturen

bv

MSG_RECV_OK ofzo?

Dan weet de server als ie niks terug krijgt dat de client zoek is :)

Verwijderd

Verwijderd schreef op 28 October 2003 @ 13:12:
[...]
is het een optie om ieder client bij het ontvangen van een bericht een bericht terug te laten sturen

bv

MSG_RECV_OK ofzo?

Dan weet de server als ie niks terug krijgt dat de client zoek is :)
Dat is dus het hele idee van ping/pong .. 't IRC protocol doet dat volgens mij ook.

Edit:
Okee, ik lees weer fout .. slechte dag vandaag 8)7

Maar IRC doet iig wel Ping/Pong :p

[ Voor 12% gewijzigd door Verwijderd op 28-10-2003 13:18 ]


Verwijderd

Topicstarter
Verwijderd schreef op 28 October 2003 @ 13:15:
[...]

Dat is dus het hele idee van ping/pong .. 't IRC protocol doet dat volgens mij ook.
zoals ik al eerder dat is inderdaad een oplossing maar ik zocht dus een manier om dit te controleren zonder steeds te "ping - pongen"

als daar echt geen oplossing voor is zal het wel op die manier moeten maar zoals ik al aangaf kost me dat elke keer veel netwerk verkeer zeker als je het hebt over vele honderde gebruikers

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 28 October 2003 @ 13:15:
Maar IRC doet iig wel Ping/Pong :p
IRC doet ping/pong omdat het op UDP gebaseerd is. Pingen is met een stateful protocol als TCP niet nodig :z

Professionele website nodig?


Verwijderd

Topicstarter
curry684 schreef op 28 October 2003 @ 13:28:
[...]

IRC doet ping/pong omdat het op UDP gebaseerd is. Pingen is met een stateful protocol als TCP niet nodig :z
dat zou kunnen maar heb jij een id dan om dit op te lossen zonder gebruik t makenen van ping/pong?

het bericht versturen gaat via
out.println("string");
out.flush();

kan ik niet detecteren of er een fout is opgetreden in de out?

ik gebruik dus TCP!

[ Voor 4% gewijzigd door Verwijderd op 28-10-2003 13:32 ]


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 16-08 19:14

Eelke Spaak

- Vlad -

Als het goed is krijg je, wanneer de client weg is, een SocketException toegeworpen in deze code:
Java:
1
2
out.println("string");
out.flush();


Probeer dus zoiets:

Java:
1
2
3
4
5
6
7
8
9
try
{
    out.println("string");
    out.flush();
}
catch (SocketException e)
{
    verwijderClient();
}

edit:
Even opgezocht: het is een Exception van het type SocketException.

[ Voor 18% gewijzigd door Eelke Spaak op 28-10-2003 15:15 ]

TheStreme - Share anything with anyone


Verwijderd

Topicstarter
Vladimir G. schreef op 28 October 2003 @ 15:09:
Als het goed is krijg je, wanneer de client weg is, een SocketException toegeworpen in deze code:
Java:
1
2
out.println("string");
out.flush();


Probeer dus zoiets:

Java:
1
2
3
4
5
6
7
8
9
try
{
    out.println("string");
    out.flush();
}
catch (SocketException e)
{
    verwijderClient();
}

edit:
Even opgezocht: het is een Exception van het type SocketException.
dat begrijp ik op die manier vang ik nu al een aantal exceptions af maar ik krijg gewoon geen exception terug op dat moment..

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 16-08 19:14

Eelke Spaak

- Vlad -

Verwijderd schreef op 28 October 2003 @ 15:17:
[...]


dat begrijp ik op die manier vang ik nu al een aantal exceptions af maar ik krijg gewoon geen exception terug op dat moment..
Als ik deze code (uit een zeer simpele zelfgeschreven server) uitvoer, krijg ik echt een SocketException waar dat moet... :?
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
    void sendMsg(String line)
    {
        Vector conPool = (Vector)connections.clone();
        Enumeration enum = conPool.elements();
        while (enum.hasMoreElements())
        {
            Object o = enum.nextElement();
            try
            {
                Socket s = (Socket)o;
                Writer out = new OutputStreamWriter(s.getOutputStream());
                out.write(line + "\r\n");
                out.flush();
                System.out.println("Written to connection: " + line);
            }
            catch (SocketException e) // <-- Hier dus
            {
                System.out.println("Client left.");
                connections.removeElement(o);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }

TheStreme - Share anything with anyone

Pagina: 1