[JAVA] Sockets

Pagina: 1
Acties:

  • MNeMoNiCS
  • Registratie: Mei 2002
  • Laatst online: 16-10-2012
In een bestaand programma, bestaande uit een client en een server, wordt voor elke request een nieuwe socketverbinding aangemaakt. Het protocol is eenvoudigweg dat de server 1 antwoord terugstuurt nadat het de request van de client ontvangen heeft.

Nu moet iedere socket netjes afgesloten worden met een close() aanroep. De client kan de close() uitvoeren wanneer hij het antwoord ontvangen heeft, maar wanneer kan de server de close()-aanroep doen? Wanneer ik op de server close uitvoer nadat het antwoord verzonden is, treedt er op de client een SocketException (Socket is closed) op. Hoe kan ik de server nu de socket laten sluiten?

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
try
{
socket.close();
}
catch (SocketException E)
{
  if(E.getMessage().equals("Socket is closed"))
 {
 // hier doe je dus niets
 }
 else
 {
   throw E;
 }
}

:?

[ Voor 27% gewijzigd door SchizoDuckie op 11-12-2006 17:39 ]

Stop uploading passwords to Github!


  • CrisT
  • Registratie: Maart 2003
  • Laatst online: 01-12 16:26
SchizoDuckie schreef op maandag 11 december 2006 @ 17:37:
Java:
1
2
3
4
5
6
7
8
try
{
socket.close();
}
catch (SocketException E)
{
 // hier doe je dus niets
}

:?
Nee, die exception treed dus niet op, er treedt client-side een exception, en die kun je gewoon afvangen (met bv niets doen).

Nederlandse Civilization community DutchCiv.nl


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Even wat uitleg bij SchizoDuckies code :)
Normaal is het doodleuk negeren van exceptions natuurlijk niet echt gewenst, maar dit is een prima voorbeeld van waar het wel gewenst is. Je wilt gewoon de Socket sluiten, en als ie dan al gesloten is boeit dat niet zo erg. Dit komt omdat er twee partijen zijn die de socket kunnen sluiten, de client en de server. Eentje is altijd eerder, wat ervoor zorgt dat de ander een exception ontangt als hij dat ook doet.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:05

voodooless

Sound is no voodoo!

Het is heel simpel, als een kant sluit, krijgt de andere kant een exception. Die moet je gewoon afvangen, aan beide zeiden.

Do diamonds shine on the dark side of the moon :?


  • MNeMoNiCS
  • Registratie: Mei 2002
  • Laatst online: 16-10-2012
Maar de client krijgt de exception al voor hij het antwoord heeft kunnen lezen...

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:05

voodooless

Sound is no voodoo!

In dat geval mag de server de verbinding niet direct sluiten. Je weet immers niet of de client je data wel gelezen heeft.

Na een flush van je data wacht je gewoon tot een timeout, of tot het socket aan de andere kant gesloten is.

Do diamonds shine on the dark side of the moon :?


  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

MNeMoNiCS schreef op maandag 11 december 2006 @ 17:43:
Maar de client krijgt de exception al voor hij het antwoord heeft kunnen lezen...
dan zul je in ieder geval ook een try / catch constructie om je socket.read() (ik weet zo de interface ff niet uit mn hoofd) aan de client kant moeten knutselen, da's de standaard manier van java om errors af te vangen.

op het moment dat je daar die excacte error (hence the E.getMessage) krijgt kan je netjes er vanuit gaan dat de server de verbinding gesloten hebt en je rotzooi opruimen en een foutmelding aan de gebruiker tonen :)


spoiler:
\o/ m'n eerste nuttige java topic reply \o/

[ Voor 2% gewijzigd door SchizoDuckie op 11-12-2006 17:50 . Reden: damn voodooless wees eens neit zo snel :P Error catching moet je uiteraard aan de server én client side doen :) in java gaat zoveel, maar tegelijkertijd niets vanzelf ]

Stop uploading passwords to Github!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

MNeMoNiCS schreef op maandag 11 december 2006 @ 17:43:
Maar de client krijgt de exception al voor hij het antwoord heeft kunnen lezen...
Ah right, ik had het niet helemaal goed gelezen. De server moet een shutdownOutput() doen als hij klaar is met het versturen van alle data. De client laat je gewoon lezen tot het einde van z'n stream, zodat hij zelf de close kan doen. Het is wellicht handig om aan de serverkant ook nog een timeout-systeem in te bouwen, zodat hij de Socket alsnog zelf closed als hij na een x aantal seconden nog niet is geclosed door de client.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MNeMoNiCS
  • Registratie: Mei 2002
  • Laatst online: 16-10-2012
.oisyn schreef op maandag 11 december 2006 @ 17:51:

Ah right, ik had het niet helemaal goed gelezen. De server moet een shutdownOutput() doen als hij klaar is met het versturen van alle data. De client laat je gewoon lezen tot het einde van z'n stream, zodat hij zelf de close kan doen. Het is wellicht handig om aan de serverkant ook nog een timeout-systeem in te bouwen, zodat hij de Socket alsnog zelf closed als hij na een x aantal seconden nog niet is geclosed door de client.
Bedankt voor je reactie! Maar is het dan in principe voldoende dat slechts één van beide de socket sluit? Of krijg ik dan een leak van memory/resources?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee het is verstandig om 'm aan beide kanten te sluiten. Als de verbinding weg is gevallen zal hij nooit actief gesloten worden aan de andere kant als de ene kant 'm sluit.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1