18. juli 2002 - 10:57Der er
5 kommentarer og 1 løsning
Sockets: Lukkede klienten sin forbindelse???
Jeg har følgende (test) kode:
import java.net.*; import java.io.*;
public class Class1 { public static void main (String[] args) throws Exception { ServerSocket server = new ServerSocket(500); Socket socket = server.accept(); BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Den virker os fint nok... Hvis jeg starter den, og Tel-netter til serveren, skriver noget i telnet og trykker Enter, kommer det frem på serveren skærm.
MEN: Hvordan finder jeg ud af, om forbindelsen til klienten faktisk stadig eksistere? Hvis jeg lukker Telnet programmet, kører server-programmet bare vidre.
Er der nogen standardmåde, hvorpå, jeg kan finde ud af, om klienten har lukket sit program?
Jeg er kommer frem til, at readLine() returnere null, hvis forbindelsen er lukket - men det kan jeg ikke bruge, da hver klient IKKE kan have sin egen tråd.
Klienterne repræsenteres af et Client-objekt, som ligger i en Queue, som en Thread-pool ligger og snakker med, og eftersom at readLink() stopper afvikling af programmet, indtil der faktisk ér noget at læse, er dette IKKE brugbart.
Det skal kompileres med Microsofts compiler (så det kan køre som en NTService), så jeg kan ikke bruge noget fra Java 1.4 etc.
du kan ikke bruge Socket.setSoTimeout()? Med den kan du angive hvor lang tid et read call på inputStreamen blocker. Jeg ved ikke hvilken version af java den kom i men den eksisterer i 1.3.
i tilfælde af at jeg ikke udtrykte mig helt klart så mente jeg at du kunne sætte soTimeout på fx 1 milisekundt og så havde en try-catch omkring din read der fanger interruptedException. på den måde kan du undersøge om der er data i hver enkelt stream meget hurtigt.
Webster: Jeg har forsøgt den model, og den gav problemer, hvis jeg f.eks. sætter soTimeout til et millisekundt, så kan den dårlig nå at læse noget fra socketten, når der faktisk ér data er læse. Den skulle stå til 4-500 før det gav nogen praktisk anvendelsesmulighed.
Jeg implementerede den løsning Søren D. forslog. Og den virker =) Tak tak ;)
Webster: Jeg har forsøgt den model, og den gav problemer, hvis jeg f.eks. sætter soTimeout til et millisekundt, så kan den dårlig nå at læse noget fra socketten, når der faktisk ér data er læse. Den skulle stå til 4-500 før det gav nogen praktisk anvendelsesmulighed.
Jeg implementerede den løsning S. Disky forslog. Og den virker =) Tak tak ;)
-- Jonas
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.