Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

[Java] Controleren of een Socket nog "leeft" (poll

w.roosenburg
15 antwoorden
  • Ik ben een server aan het schrijven in Java, maar ik kan geen goede manier vinden om te controleren of een client de connectie al verbroken heeft. Alle tutorials die ik kan vinden zeggen dat ik blocking I/O en threads moet gebruiken, maar daar houd ik niet van (en ik moet dan al mijn code herschrijven).
    Is er een standaard functie dat vergelijkbaar is met de poll() functie in Unix? Of is er een betere manier?
  • RobertV,

    welke JDK gebruik je?
    In 1.4 heeft Socket een methode isClosed(), is dat wat je zoekt?

    Welke tutorials lees jij?

    Herman
  • JDK 1.4.1. En nee, isClosed() controlleert alleen of ik close() heb aangeroepen. Ik zoek iets dat vergelijkbaar is met de Unix poll() functie.

    En de tutorials zoek ik op Google met "java socket tutorial" ofzo.
  • Kun je dat niet aan de hand van de desbetreffende input-/outputstream controleren?
  • Nee. Die functies blokkeren als de client nog geen data heeft verstuurd. Hoe moet ik de invoer van alle andere clients lezen als ik geblokkeerd word?
  • [quote:a4e63a4eb5="RobertV"]Nee. Die functies blokkeren als de client nog geen data heeft verstuurd. Hoe moet ik de invoer van alle andere clients lezen als ik geblokkeerd word?[/quote:a4e63a4eb5]
    Dit soort dingen dien je in GUI-loze threads af te handelen.
  • Inderdaad, om het sowieso mooi op te lossen, zul je threads moeten gebruiken. Wat is precies je bezwaar tegen threads?
  • Veel mensen, onder andere de Linux kernel developers, zeggen dat een thread aanmaken voor elke client zeer inefficient is, ook al is de scheduler van de kernel nog zo goed.
  • Hmmm… nog niet eerder van gehoord. Ik kan mij niet voorstellen dat in een client/server-omgeving geen nuttig gebruik van threads gemaakt kan worden. Je wilt toch niet, dat gebruikers op elkaar moeten gaan wachten?

    Een vergelijkbaar voorbeeld is de Java Servlet. Dat is ook een multi-threaded omgeving. En waarom? Omdat dat de meest optimale situatie is.
  • [quote:5a446a76d2="RobertV"]Veel mensen, onder andere de Linux kernel developers, zeggen dat een thread aanmaken voor elke client zeer inefficient is, ook al is de scheduler van de kernel nog zo goed.[/quote:5a446a76d2]Klopt.

    Maar toch ontkom je er niet aan, wat je moet doen is een threadpool maken, standaard een x aantal threads initialiseren en op het moment dat er een client actief wordt deze gaan gebruiken (en weer vrijgeven als deze klaar is). Zo bespaar je de overhead van het constant aanmaken van threads…
  • [quote:95eb9d8eb9="Heronymus"]Je wilt toch niet, dat gebruikers op elkaar moeten gaan wachten?[/quote:95eb9d8eb9]Unix heeft de functies poll en select waarbij je meerdere sockets kunt controleren. Deze zijn vanuit C zonder meer beschikbaar. Aangezien Unix alle devices hetzelfde behandelt (sockets, files, seriele poorten) kun je met 1 instructie wachten op keyboard-input, alle seriele poorten en tientallen sockets. Je hebt totaal geen threads nodig (oh wat is het leven toch heerlijk simpel).

    Ik vermoed dat je nu voor Windows programmeert aangezien je refereeert naar Unix. In de Windows API bestaat een [i:95eb9d8eb9]select[/i:95eb9d8eb9]-achtig iets (WSAselect of zoiets). Je zou deze even kunnen opzoeken, maar je zult teleurgesteld zijn in de mogelijkheden als je Unix gewend bent. Volgens mij ontkom je onder Windows niet aan threads als je meerdere connecties wilt accepteren.
  • Ik programmeer voor Java (staat ook in het onderwerp :roll:) en ik kan echt geen poll/select-achtig functie vinden.

    Uiteindelijk heb ik de boel toch maar herschreven met threads.
  • Wat is er toch tegen op threads? Er zullen ongetwijfeld andere mogelijkheden zijn in andere omgevingen, maar de thread is toch speciaal bedoeld voor dit soort zaken?
  • [quote:6c62881260="RobertV"]Ik programmeer voor Java (staat ook in het onderwerp :roll:)[/quote:6c62881260]Nee, volgens mij programmeer je in een taal (Java) en dan eventueel voor een OS (Windows?).

    [quote:6c62881260="RobertV"]…. en ik kan echt geen poll/select-achtig functie vinden.
    Uiteindelijk heb ik de boel toch maar herschreven met threads.[/quote:6c62881260]Toch maar terug naar Unix en C :)
  • [quote:6bf3c308e6]Nee, volgens mij programmeer je in een taal (Java) en dan eventueel voor een OS (Windows?).[/quote:6bf3c308e6]

    In Java kun je de Win32 of POSIX API niet direct aanspreken. :roll:

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.