Avatar billede apocryphal Nybegynder
18. juli 2002 - 10:57 Der 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()));

        while(true)
            if(input.ready())
                System.out.println("Read: " + input.readLine());
    }
}

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.

--
Jonas
Avatar billede r9 Nybegynder
18. juli 2002 - 11:03 #1
java app som win services:
http://www.kcmultimedia.com/javaserv/
Avatar billede disky Nybegynder
18. juli 2002 - 11:53 #2
Det problem har alle.

Det er svært at detekte om en forbindelse er åben eller ej.

Der er ikke meget andet at gøre end f.eks. at forvente en pakke hvert 5 sekunde ellers er linien død, eller gøre som du selv foreslår.

Jeg mener dug jdk1.4 tillader timeouts som du så kan bruge
Avatar billede webster Nybegynder
18. juli 2002 - 15:02 #3
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.
Avatar billede webster Nybegynder
18. juli 2002 - 15:43 #4
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.
Avatar billede apocryphal Nybegynder
18. juli 2002 - 19:34 #5
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 ;)

--
Jonas
Avatar billede apocryphal Nybegynder
18. juli 2002 - 19:35 #6
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester