Hoe programmeer ik een server-thread programmerend als hij continu naar nieuwe verbindingen luistert?

Ik wil programmeerbaar een thread doden die in een tijdje (ware) loop loopt en oneindig naar connecties luistert en aangezien luisteren een blokkerende methode is, kan ik het statemenet van de loops eenvoudigweg niet instellen als false. Mijn applicatie wisselt in het algemeen periodiek van netwerk wanneer aangesloten een server opstart om naar verbindingen te luisteren, dus wanneer het naar een ander netwerk wordt omgewisseld, ben ik bang dat de oude server een zombie zal worden en daar gewoon vastloopt omdat op het nieuwe netwerk de server gebonden is andere IP dan degene die het eerder had.

PS. zal de server aan localhost binden zonder dat deze na het veranderen van het netwerk opnieuw moet worden ingesteld?

3
@NoICE de taal zit in de tags, JAVA :), hoe kan een methode zoals socket.accept() refactoren? Is dat zelfs mogelijk?
toegevoegd de auteur Miky, de bron
Het eerste wat ik zou aanraden is om je code te refactoren naar niet-blokkerende oproepen, als dat mogelijk is in jouw taal (tussen haakjes, je hebt niet vermeld welke). Dan zou je gewoon de lus kunnen doorbreken ... EDIT: sorry ik heb net gemerkt dat het in de Java-categorie is.
toegevoegd de auteur Dalibor Filus, de bron
Ruby heeft IO.selecteer call in plaats van accept .. en ik wed dat java een andere methode heeft om dat ook te doen ... Gewoon Google "java non blocking io" (of socket) (ik wil hier graag meer mee helpen, maar ik ben een beginner in Java)
toegevoegd de auteur Dalibor Filus, de bron

3 antwoord

Als u een thread in een accept -lus moet kunnen stoppen, kunt u gewoon setSoTimeout , zodat de accepteren gesprek kan worden voltooid zonder te wachten op een daadwerkelijke verbinding gebeuren.

Merk op dat als u aan alle interfaces bindt, u waarschijnlijk geen nieuwe socket hoeft te maken wanneer een nieuwe netwerkinterface aan het systeem wordt toegevoegd.

Andere mogelijkheden zijn het aanroepen van sluiten op de socket, of stop of interrupt op de thread. Als u async I/O kunt gebruiken, raadpleegt u http://www.developer.com/java/article.php/3837316/Non-Blocking-IO-Made-Possible-in-Java.htm .

4
toegevoegd

Sluit het ServerSocketChannel en de thread calling accept() gooit AsynchronousCloseException of ClosedChannelException.

Een andere mogelijkheid zou zijn om de draad te onderbreken. Volgens de JDK-documentatie zou het vervolgens ClosedByInterruptException moeten gooien bij het aanroepen van accept() en daarmee het kanaal sluiten. Echter, in mijn ervaring werkte het ClosedByInterruptException ding niet altijd betrouwbaar en zijn er bekende fouten in bepaalde JDK-versies.

1
toegevoegd

Heb je de vraag google? Er is veel over hoe u discussies in uw code kunt stoppen.

De documentatie van Sun heeft wat je nodig hebt:

http://docs.oracle.com/javase/ 1.4.2/docs/gids/misc/threadPrimitiveDeprecation.html

En hier is een gerelateerde vraag waar ik dit van kreeg:

Hoe doodt u een thread in Java?

kijk alsjeblieft rond voordat je een vraag stelt.

0
toegevoegd
ja ik heb wat onderzoek gedaan voordat ik het plaatste, mijn vraag is niet zo simpel als het doden van een draad die trouwens zijn riskant is in Java, want in mijn situatie zal het hoogstwaarschijnlijk een zombie-proces worden.
toegevoegd de auteur Miky, de bron