# GUI friert bei UDP ein



## rhilge (29. Dez 2018)

Hallo,
ich habe angefangen mich mit Server- und Client-Einrichtung zu beschäftigen. 
Grob zusammengefasst möchte ich einen Wert, der im Controller des Servers bestimmt wird, in der JavaFX-GUI des Servers ausgeben und gleichzeitig diesen Wert auch an angemeldete Clients weiterreichen. Die diese ebenfalls in ihrer GUI ausgeben. Geschehen soll das ganze über UDP.

Mein Problem ist gerade, dass die GUI des Servers einfriert (bzw. garnicht final aufgebaut wird), da mein UDP-Server offensichtlich auf ein eingehendes Paket von Clients wartet, die es aber noch nicht gibt zu dem Zeitpunkt.

Ich hatte schon gelesen, dass ich wohl Platform.runLater verwenden muss. Aber ich verstehe überhaupt nicht wie. 


```
DatagramSocket socket = null;
        try {
            socket = new DatagramSocket(5000);
            while (true) {
                 DatagramPacket packet = new DatagramPacket(new byte[5], 5);
                try {
                    socket.receive(packet);
                     new UDPServer(packet, socket, mediaHandler).start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } finally {
            socket.close();
        }
```

Ab socket.receive(packet) passiert nichts mehr.


----------



## httpdigest (29. Dez 2018)

Ja, DatagramSocket.receive() blockiert den aktuellen Thread, bis ein Paket empfangen wird.
Platform.runLater() wird dir hier auch nicht helfen, da es ja auch den GUI Thread verwendet.
Für Netzwerkprogrammierung verwendet man üblicherweise einen separaten/eigenen Thread oder Non-Blocking IO.


----------



## mihe7 (30. Dez 2018)

Und Platform.runLater brauchst Du, um aus dem separaten Thread heraus das UI zu manipulieren.


----------



## rhilge (3. Jan 2019)

Danke hat inzwischen geklappt!
Wenn es ok ist, würde ich gerne noch eine ergänzende Frage zu TCP-Server stellen.

Und zwar habe ich folgenden Client-Thread:

```
public void run() {

        try (
            Socket serverCon = new Socket("localhost", 5020);
            BufferedReader in = new BufferedReader(new InputStreamReader(serverCon.getInputStream()));
            PrintWriter out = new PrintWriter(serverCon.getOutputStream(), true)
        ){
            out.write(clientName);
            //out.write(PW);

            // Ergebnis entgegennehmen
            String result = in.readLine();

            System.out.println(result);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
```

Und folgenden Server-Thread:


```
String msg = "EchoServer: Verbindung " + name;
        System.out.println(msg + " hergestellt");
        try (
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true)
        ){
            String clientName = in.readLine();

            synchronized (clientList){
                if (clientPW == "TestPW"){
                    clientList.add(clientName);
                    out.write("dienstname???");
                    //out.flush();
                }else{
                    out.write("Falsches Passwort");
                    //out.flush();
                }
            }


        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
```

Und es kommt kein Fehler oder sonstiges, aber es wird auch nichts von a nach b übertragen. Bzw. passiert im Client bei         String result = in.readLine(); nichts und beim Server bei String clientName = in.readLine();
Was danach passiert ist erstmal nebensächlich, aber warum kommt da nichts an?
Die Ports sollten stimmen und "localhost" müsste ja auch kein Problem sein. Den UDP-Server las ich nebenher laufen, aber auf anderem Port...

Danke!


----------



## mihe7 (3. Jan 2019)

Mach mal überall nach einem write auch ein flush.


----------



## Robat (3. Jan 2019)

Verwende anstatt PrintWriter#write(String) einfach PrintWriter#println(String). Ersteres sendet, mWn, kein CRLF mit und daher wird die HTTP Nachricht nie beendet.
PrintWriter sollte dann automatisch flushen, wenn man ihm als zweites Argument im Konstruktor `true` mitgibt. PrintWriter(OutputStream, boolean)


----------



## mihe7 (3. Jan 2019)

Robat hat gesagt.:


> kein CRLF


Das readLine hab ich ganz übersehen...


----------



## rhilge (3. Jan 2019)

Perfekt! Danke!


----------

