java.net.SocketTimeoutException: Read timed out

Maxi92

Aktives Mitglied
Hi leute!

Wir haben eine Server ( die SPS) Client (PC) Verbindung jedoch haben wir folgendes Problem:
Wir haben eine Klasse in der wir den ScheduledExecutorService mit scheduleWithFixedDelay verwenden. Leider bekommen wir bevor wir das 1. mal von der SPS etwas zurückbekommen diesen Fehler:

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 Hagelkanone.business.DefaultClient.sendAndReceiveLine(DefaultClient.java:39)
at Hagelkanone.business.StringSenden$1.run(StringSenden.java:81)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)


Hab im Internet schon was drüber gelesen, dass das Socket Objekt i-wie 2mal verwendet werden soll oder so i-wie...kenn mich nicht so aus und wollte daher fragen ob wer ne Lösung hat:

Java:
public class StringSenden
{
    private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private Socket socket = null;

    private final String IpAdress = "192.168.0.1";
    private final int Port = 11159;

    public StringSenden()
            throws Exception
    {
        final InetAddress adress = InetAddress.getByName(IpAdress);

        // Erstellen der run - Methode
        final Runnable empfangen = new Runnable()
        {
            public void run()
            {
                try
                {
                    i++;
                    System.out.println("test " + i);                    

                    if(socket == null)
                    {
                        socket = new Socket(adress, Port);
                        socket.setSoTimeout(5000);
                    }

                 ..... erstellen des zusendenden Strings....       

                    //Senden des Strings
                    System.out.println("senden des Strings " + zuSendenderString);
                    String spsString = DefaultClient.sendAndReceiveLine(socket, zuSendenderString);
                    System.out.println("--- fertig ---" + spsString);

                    //Speichern des zerlegten empfangenen Strings
                    strFeld = strZer.Geschw(spsString);
                    manGUI.setGeschwindigkeitsTextfelder(strFeld);

                    for (int i = 1; i < 11; i++)
                    {
                        if(strFeld[i].equals("ERR") || strFeld[i].equals("BSY") || strFeld[i].equals("OFF") || strFeld[i].equals("0"))
                        {
                            System.out.println(strFeld[i] + "es wurde noch kein Objekt erzeugt");
                        }
                        else
                        {
                            System.out.println("StrSenden: einlesen der geschwindigkeit\n");
                            speed = Double.parseDouble(strFeld[i]);

                            if(speedold != speed)
                            {
                                speedold = speed;
                                System.out.println("StrSenden: erzeugen des Objekts\n");
                                Kanone kan = new Kanone("Kanonexx", 1, 25, speed, 2500);
                            }
                        }
                    }
                    socket.close();
                    socket = null;
                }
                catch (Exception e)
                {
//                    JOptionPane.showMessageDialog(null, "StringSenden_run: " + e.getMessage(), "Fehler", JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
                }                
            }
        };

        //Ausführen der run - Methode alle 500ms
        scheduler.scheduleWithFixedDelay(empfangen, 500, 500, TimeUnit.MILLISECONDS);
    }

}


Java:
public class DefaultClient
{
    public DefaultClient()
    {
    }

    public synchronized static String sendAndReceiveLine(Socket socket, String text)    
        throws Exception
    {
        OutputStream os = socket.getOutputStream();
        OutputStreamWriter ows = new OutputStreamWriter(os);
        BufferedWriter bw = new BufferedWriter(ows);
        bw.write(text);
        bw.newLine();
        bw.flush();

        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String antwort = br.readLine();

        br.close();
        bw.close();
        return antwort;
    }
}

danke schon mal im Voraus!
 
die Fehlermeldung klingt erstmal so simpel wie es da steht, Timeout weil keine Antwort kommt,
ohne den Server zu kennen kann man pauschal dort den Fehler vermuten, wenn der nichts zurücksendet, was soll man machen?
kannst in Java testweise einen Server bauen, falls du diesen nicht als Quellcode vorliegen hast, mit einem direkt antwortenden Server funktionierts vielleicht

problematisch ist evtl. ebenso, dass der Timeout von dir auf 5 sec begrenzt wird,
klingt an sich viel, aber wenn man überlegt wie lange im ungünstigen Fall eine schlecht angebundene Internetseite braucht..,
ist der Server auf demselben Rechner oder im lokalen Netzwerk?, 192.168.0.1 klingt ja eher vertraut,
dennoch auch mit Timeout 60 sec bzw. ganz ohne Timeout testen?

edit:
upps, schon 2-3 Tage alt, da lohnt sich eigentlich nur zu fragen: Thema noch aktuell?
 
Zuletzt bearbeitet von einem Moderator:
Problem hat sich gestern erledigt!
es lag an der SPS hatten dort ein Problem mit dem Socket und dadurch der Read Timed Out Fehler!

trotzdem Danke für die Hilfe!
 

Zurück
Oben