[Java] Socket of inputstream probleem

Pagina: 1
Acties:

  • Mfpower
  • Registratie: Februari 2000
  • Laatst online: 21-08 07:16
Ik heb een client en een server geschreven in java. Deze communiceren met elkaar door middel van sockets. Nu is het de bedoeling dat de verbinding een tijd open blijft staan, waarbij de client zo nu en dan info in de vorm van chars of bytes naar de server stuurt.

Nu wil ik dat de server alleen reageert op het moment dat de client data verstuurt. Alleen het probleem is dat ik aan de serverkant continu moet checken of er data verstuurd is door de client. Ik krijg dus een lus (verbinding is inmiddels verkregen):

code:
1
2
3
4
5
while (true) {
  var = in.read() ;
  if (var != -1)
     doStuff() ;
}


Het probleem is dat een programma in een infinite lus laten lopen niet getuigd van enige efficientie. Wat ik eigenlijk wil is een of andere event die aangeroepen wordt op het moment dat er weer data in de readbuffer staat. Is zoiets dergelijks mogelijk?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 21-08 14:03

Robtimus

me Robtimus no like you

Ik weet niet of het bij sockets net zo gaat, maar werkt het volgende niet?
Java:
1
2
3
while((var = in.read()) != -1) {
    doStuff();
}
Ik weet nml niet wat er gebeurt als er niets over de socket gestuurd wordt. Als ie blokkeert op de in.read() totdat er iets beschikbaar wordt gesteld zou het iig moeten werken.

[ Voor 19% gewijzigd door Robtimus op 30-09-2003 14:11 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Mfpower
  • Registratie: Februari 2000
  • Laatst online: 21-08 07:16
IceManX: jouw code lijkt leuk. Maar als er niets geschreven wordt naar de buffer dan levert in.read() -1 op en dan komt ie niet in de while lus. Dat lijkt wel op wat ik wil. Maar ik wil op het moment dat er WEL over de socket geschreven wordt (na een lange tijd van idlen) dat er actie ondernomen wordt...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Blocking sockets, en dan een aparte leesthread aanmaken

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.


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Mfpower schreef op 30 September 2003 @ 13:50:
Het probleem is dat een programma in een infinite lus laten lopen niet getuigd van enige efficientie. Wat ik eigenlijk wil is een of andere event die aangeroepen wordt op het moment dat er weer data in de readbuffer staat. Is zoiets dergelijks mogelijk?
Je zou het stukje code in een aparte thread moeten laten uitvoeren dan staat je programma ook niet te blocken.
Je zou bijv. in zo'n thread om een bepaalde interval kunnen gaan controleren of er data in de socket aanwezig is.

It’s nice to be important but it’s more important to be nice


  • Mfpower
  • Registratie: Februari 2000
  • Laatst online: 21-08 07:16
JonkieXL schreef op 30 September 2003 @ 14:17:
[...]

Je zou het stukje code in een aparte thread moeten laten uitvoeren dan staat je programma ook niet te blocken.
Je zou bijv. in zo'n thread om een bepaalde interval kunnen gaan controleren of er data in de socket aanwezig is.
Dat zou kunnen, maar dat is een verplaatsing van het probleem. In feite heb je dan nog steeds een infinite loop alleen dan met een interval. Daarbij kan ik me voorstellen dat als je niet direct uit begint te lezen een buffer overflow mogelijk is?

Ik kwam er achter dat de methode readline() het wel goed doet. Deze blijft net zo lang "hangen" tot er een lijn te lezen is (als ik met telnet naar m'n server connect en dan op <enter> druk dan reageert m'n server meteen).

Maar goed dat is alleen leuk voor ascii data met newlines... ik had andere plannen :|

  • Mfpower
  • Registratie: Februari 2000
  • Laatst online: 21-08 07:16
.oisyn schreef op 30 September 2003 @ 14:15:
Blocking sockets, en dan een aparte leesthread aanmaken
Dat ken ik niet. Heb je info of een voorbeeld?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Socket.setSoTimeout ()

:)

[ Voor 20% gewijzigd door .oisyn op 30-09-2003 14:34 ]

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.


Verwijderd

Ik weet niet precies waarom je zo lastig doet maar read() blijft ook gewoon "hangen" tot dat er weer een byte beschikbaar is van de socket inputstream. Je krijgt dus geen loop die 100% cpu time gaat vreten... Sockets "blocken" gewoon totdat er data beschikbaar is.

Wil je een "socket readyness" systeem opzetten, dus dat je geen extra thread nodig hebt die blijft "hangen" tot er nieuwe data beschikbaar is maar dat je door middel van events krijgt te horen over er data is, dan moet je Java NIO gaan doen maar das wel wat lastigere dan het blocking sockets model...

Grtz Dark

[ Voor 5% gewijzigd door Verwijderd op 30-09-2003 15:37 ]


  • Mfpower
  • Registratie: Februari 2000
  • Laatst online: 21-08 07:16
Ja probleem ondertussen verholpen. Door een of andere vage setting verbrak ie de verbinding telkens (zonder dat ik het doorhad) dus kreeg ik steeds een -1 in plaats van dat read() bleef hangen. Wat is Java NIO dan? Klinkt ook wel interessant.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Java NIO is de Java New I/O api. Geïntroduceerd in 1.4. Lees hier meer
't is wat performanter dan java.io en vult deze aan met wat nuttige classes.

Zie op die pagina ook voorbeelden over hoe het te gebruiken.
Pagina: 1