ServerSocket: Exceptions und Timeout Probleme

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,


anbei ein Versuch eines Mini-Servers. Man verbindet sich mit ihm
und kann einen Text hinschicken, erhält ihn dann zurück.

Der "Server" hat folgende Schwachstellen:

1. Kommt es zu einem Timeout, wird die Exception ausgelöst,
im Catch-Part kann ich aber kein: client.close() machen,
der Compiler beschwert sich, dass client möglicherweise uninitialisiert ist,
bzw. kann garnicht die Variable "sehen". Ohne client.close bleiben
Clients bei einem Timeout aber einfach als "offen" hängen, z.B. Telnet.

2. Bei einem Timeout und einer daraus folgenden Exception
wird meine While-Schleife unterbrochen, den Catch-Part kann ich
aber auch nicht in die While-Schleife packen, da dies einen Compiler-Fehler
ergibt, da es sich dann mit dem try beisst.


Was kann ich tun?


Vielen Dank!


Thomas



Code:
public class mySocketServer extends Thread {
    
    boolean Terminated=false;
    
    @Override
    public void run() {
    
    ServerSocket sserver;  
    BufferedReader in;
    PrintWriter out;
    
   
    try{

    sserver = new ServerSocket(1234, 10, InetAddress.getByName("127.0.0.1"));
    
    while(!Terminated) {
        Socket client = sserver.accept();
        client.setSoTimeout(2000);

        in  = new BufferedReader(new InputStreamReader(client.getInputStream()));
        out = new PrintWriter(client.getOutputStream());
        
        String message = in.readLine();
        out.write(message+"\0");
        out.flush();
        System.out.println(message);
        in.close();
        out.close();
        client.close();
    }
    }catch(IOException e) 
     {
        System.out.println("IO-Exception: "+e);
        
     }
    
    
    return;
    }
 
G

Guest

Gast
Ergänzung zu 2. : Das hat dann zur Folge, dass sich nach dem Timeout eines Clients (->Exception) dann kein weiterer Client mehr mit dem "Server" verbinden kann, was ja nicht im Sinne des Erfinders ist...
 

lhein

Top Contributor
Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class MySocketServer extends Thread 
{
    ServerSocket sserver;
    BufferedReader in;
    PrintWriter out;
    boolean terminated=false;
   
    public void stopServer()
    {
        terminated = true;
    }
    
    @Override
    public void run() 
    {
        try 
        {
            sserver = new ServerSocket(1234, 10, InetAddress.getByName("127.0.0.1"));
        }
        catch(IOException e)
        {
            System.out.println("IO-Exception: "+e);
            terminated = true;
        }

        Socket client = null;
    
        while(!terminated) 
        {
            try 
            {
                client = sserver.accept();
                client.setSoTimeout(2000);

                in  = new BufferedReader(new InputStreamReader(client.getInputStream()));
                out = new PrintWriter(client.getOutputStream());
       
                String message = in.readLine();
                out.write(message+"\0");
                System.out.println(message);
            } 
            catch(IOException e) 
            {
                System.out.println("IO-Exception: "+e);
            } 
            finally 
            {
                try
                {
                    in.close();
                    out.close();
                    client.close();
                }
                catch(IOException ex)
                {
                    System.out.println("IO-Exception: "+ex);
                }
            }
        }
     }
}

Ich habs mal n bisl umgestellt. Nicht geprüft und so würd ich es sicher auch nicht machen.
Kleiner Hinweis: Dein Server kann immer nur einen Client gleichzeitig behandeln.

lr
 
G

Guest

Gast
Ja, jetzt funktioniert 2).

Hat noch jemand eine Idee, wie ich es schaffe, in einer Timeout-exception noch ein client.close machen zu können?
 
G

Guest

Gast
Die 2. Exceptions-Möglichkeit von oben wird ausgelöst.
Baut man nun in deinen neuen Code noch ein client.close() in die 2. Exception ein, dann klappts. Vielen Dank!!!

Code:
  while(!terminated) 
        { 
            try 
            { 
                client = sserver.accept(); 
                client.setSoTimeout(2000); 

                in  = new BufferedReader(new InputStreamReader(client.getInputStream())); 
                out = new PrintWriter(client.getOutputStream()); 
        
                String message = in.readLine(); 
                out.write(message+"\0"); 
                System.out.println(message); 
            } 
            catch(IOException e) 
            {   
                System.out.println("IO-Exception2: "+e); 
                try{
                in.close();
                out.close();
                client.close();
                }catch(IOException e1) {}
                
            } 
            finally 
            { 
                try 
                { 
                    in.close(); 
                    out.close(); 
                    client.close(); 
                } 
                catch(IOException ex) 
                { 
                    System.out.println("IO-Exception3: "+ex); 
                } 
            } 
        }
 

lhein

Top Contributor
Deine Änderung ist so nicht gut. Finde bitte genau die Zeile heraus, wo die Exception geworfen wird, bzw. poste mal den StackTrace hier.
 
G

Guest

Gast
Bei einem Timeout passiert das hier:
IO-Exception2: java.net.SocketTimeoutException: Read timed out

Was meinst Du genau mit: "Deine Änderung ist so nicht gut. " ?
 

lhein

Top Contributor
Packe mal unter:

Code:
System.out.println("IO-Exception2: "+e);

die Zeile:

Code:
e.printStackTrace();

Und dann poste mal was da steht.

lr
 
G

Guest

Gast
Hallo,

da bekomme ich das hier:


IO-Exception2: java.net.SocketTimeoutException: Read timed out
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at java_myserver.mySocketServer.run(mySocketServer.java:51)
 

lhein

Top Contributor
Also wird die Exception anscheinend hier geworfen:

Code:
String message = in.readLine();

Es könnte sein, daß der Versuch, "in" zu schliessen (in.close()) eine Exception auslöst.

Probier mal folgendes:

Code:
while(!terminated)
        {
            try
            {
                client = sserver.accept();
                client.setSoTimeout(2000);

                in  = new BufferedReader(new InputStreamReader(client.getInputStream()));
                out = new PrintWriter(client.getOutputStream());
       
                String message = in.readLine();
                out.write(message+"\0");
                System.out.println(message);
            }
            catch(IOException e)
            {   
                System.out.println("IO-Exception2: "+e);
            }
            finally
            {
                try
                {
                    in.close();
                }
                catch(IOException ioex)
                {
                    System.out.println("in schon geschlossen");
                }

                try
                {
                    out.close();
                    client.close();
                }
                catch(IOException ex)
                {
                    System.out.println("IO-Exception3: "+ex);
                }
            }
        }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J ServerSocket: Problem, wenn Clientverbindung gekappt wird. Java Basics - Anfänger-Themen 1
B Input/Output Multiport ServerSocket Java Basics - Anfänger-Themen 3
A ServerSocket accept bei mehreren Clients? Java Basics - Anfänger-Themen 2
M Test auf Exceptions schreiben Java Basics - Anfänger-Themen 11
berserkerdq2 Habe zwei exceptions, welche ist ein Kommunikationsfehler und welche ein Ausgabefehler? Java Basics - Anfänger-Themen 4
julian112 Input/Output .gz bzw. .txt Datei Einlesen und Umgang mit Exceptions Java Basics - Anfänger-Themen 1
C Exceptions identifizieren Java Basics - Anfänger-Themen 5
A Exceptions mit objektreferenzen Java Basics - Anfänger-Themen 4
A Exceptions und methods Java Basics - Anfänger-Themen 2
A Cannot find symbol bei exceptions Java Basics - Anfänger-Themen 2
A Exceptions und Packages Java Basics - Anfänger-Themen 6
B JUnit / Exceptions/ try-catch Java Basics - Anfänger-Themen 6
X Exceptions Benutzereingaben Java Basics - Anfänger-Themen 4
F Exceptions in Interfaces Java Basics - Anfänger-Themen 4
F Mehrere Exceptions in einem Catch-Block abfangen Java Basics - Anfänger-Themen 12
L Exceptions und Konten Java Basics - Anfänger-Themen 21
D Frage zu Exceptions Java Basics - Anfänger-Themen 8
I Wie programmiert man Exceptions? Java Basics - Anfänger-Themen 4
N Unterschied zwischen Checked und Unchecked Exceptions Java Basics - Anfänger-Themen 12
C Erste Schritte Exceptions nicht verstanden Java Basics - Anfänger-Themen 2
J Fragen zu Exceptions Java Basics - Anfänger-Themen 24
T Exceptions - ausgeführte Zeilen Java Basics - Anfänger-Themen 4
J Exceptions Java Basics - Anfänger-Themen 69
C Exceptions Java Basics - Anfänger-Themen 8
C Exceptions Java Basics - Anfänger-Themen 6
A ArrayQueue mit Exceptions und Vererbung Java Basics - Anfänger-Themen 3
F Exceptions Java Basics - Anfänger-Themen 6
J Frage zum Thema Exceptions (Try/Catch) Java Basics - Anfänger-Themen 3
M "Exceptions abfragen" Java Basics - Anfänger-Themen 6
Farbenfroh Exceptions Anfänger - Finde Fehler nicht Java Basics - Anfänger-Themen 7
Z Catch & Exceptions Java Basics - Anfänger-Themen 4
N Compiler-Fehler Drei Exceptions in GUIHack für Dreiecke auf MoveButtons Java Basics - Anfänger-Themen 36
V Welche Exceptions müssen importiert werden? Java Basics - Anfänger-Themen 3
S Exceptions Java Basics - Anfänger-Themen 7
M Vererbung Problem Vererbung/Exceptions Java Basics - Anfänger-Themen 9
S Verschachtelte Exceptions - Übersicht verbessern Java Basics - Anfänger-Themen 2
J Eclipse Exceptions Java Basics - Anfänger-Themen 2
K Schleifen und Exceptions Java Basics - Anfänger-Themen 8
K Exceptions auslagern Java Basics - Anfänger-Themen 15
R NullPointer Exceptions Java Basics - Anfänger-Themen 3
F Erste Schritte Übung zu Exceptions Java Basics - Anfänger-Themen 24
R Exceptions (try/catch) Java Basics - Anfänger-Themen 63
H Int Exceptions Java Basics - Anfänger-Themen 12
M Exceptions per throws oder try Java Basics - Anfänger-Themen 4
M Compiler-Fehler Queue als ArrayList mit Exceptions Java Basics - Anfänger-Themen 3
T Exceptions in einer Klasse Java Basics - Anfänger-Themen 3
B Eigene Exceptions entwerfen Java Basics - Anfänger-Themen 3
H Methoden Überflüssige Exceptions Java Basics - Anfänger-Themen 20
C Exceptions Java Basics - Anfänger-Themen 14
1 While Schleife Exceptions Java Basics - Anfänger-Themen 6
I Erste Schritte Eigene Fehlermeldungen bei Exceptions Java Basics - Anfänger-Themen 19
D Frage zu Exceptions Java Basics - Anfänger-Themen 12
M Compiler-Fehler Exceptions lieber throwen oder direkt catchen? Java Basics - Anfänger-Themen 8
T Exceptions Java Basics - Anfänger-Themen 19
B Wie finde ich Exceptions? Java Basics - Anfänger-Themen 19
Dit_ Input/Output Alle Exceptions protokollieren Java Basics - Anfänger-Themen 9
T Exceptions Java Basics - Anfänger-Themen 12
J Standard Exceptions abfangen Java Basics - Anfänger-Themen 5
F Exceptions werfen oder catchen?? Java Basics - Anfänger-Themen 14
D Exceptions - Ausnahmebehandlung Java Basics - Anfänger-Themen 19
D Frage zu Exceptions und der import Anweisung Java Basics - Anfänger-Themen 12
J Paar Fragen zu Exceptions Java Basics - Anfänger-Themen 16
G Verständnisproblem: Exceptions Java Basics - Anfänger-Themen 17
S Exceptions bei push/pop in Stack Java Basics - Anfänger-Themen 8
C Exceptions beim Beenden Java Basics - Anfänger-Themen 2
C TimerTask und Exceptions Java Basics - Anfänger-Themen 5
E Klasse öffnen, mehrere Exceptions Java Basics - Anfänger-Themen 9
C Exceptions Java Basics - Anfänger-Themen 7
G 2 Exceptions in einer Methode Java Basics - Anfänger-Themen 3
firefexx Exceptions werfen Java Basics - Anfänger-Themen 5
0 Exceptions mehrfach fangbar? Java Basics - Anfänger-Themen 4
O Exceptions Java Basics - Anfänger-Themen 3
K Sinn eigener Exceptions Java Basics - Anfänger-Themen 11
H Diverse Exceptions - Troubleshooting Java Basics - Anfänger-Themen 3
J exceptions Java Basics - Anfänger-Themen 8
sc0p InterruptedExceptions und Exceptions - in Einem! Java Basics - Anfänger-Themen 5
M Frage zu Exceptions Java Basics - Anfänger-Themen 19
M Fragen zu Exceptions Java Basics - Anfänger-Themen 3
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
D Exceptions werfen + beenden Java Basics - Anfänger-Themen 12
M Exceptions aus interface-Methoden Java Basics - Anfänger-Themen 2
S File.renameTo und Exceptions / Fehlermeldung Java Basics - Anfänger-Themen 2
B Exceptions in Liste sammeln? Java Basics - Anfänger-Themen 5
O Eigene Exceptions Java Basics - Anfänger-Themen 11
O "restliche" Exceptions fangen Java Basics - Anfänger-Themen 8
H [Stil] Exceptions in der Klasse behandeln oder throwen? Java Basics - Anfänger-Themen 62
T Problem beim Werfen und Fangen von Exceptions Java Basics - Anfänger-Themen 2
V Aktivitätsdiagramm / Exceptions Java Basics - Anfänger-Themen 5
V Exceptions Java Basics - Anfänger-Themen 6
K Frage zu Exceptions -> Logging Java Basics - Anfänger-Themen 6
M Eigene Fehlermeldung bei Exceptions? Java Basics - Anfänger-Themen 12
R JDom Exceptions Java Basics - Anfänger-Themen 4
R Datei einlesen mit Exceptions Java Basics - Anfänger-Themen 2
Daniel_L Verwendung von try und catch bei exceptions Java Basics - Anfänger-Themen 7
C Reflection Exceptions behandeln Java Basics - Anfänger-Themen 6
G Exceptions - spiegeln wir da nicht einen Spiegel im Spiegel? Java Basics - Anfänger-Themen 10
G Verschiedene Exceptions zu gleichem Block Java Basics - Anfänger-Themen 6
U Frage zu Exceptions Java Basics - Anfänger-Themen 5
mwildam Philosophiefrage zu Exceptions und Rückgabewerten Java Basics - Anfänger-Themen 6
D Static, final Objekte mit Exceptions im Konstruktor Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben