GUI friert bei UDP ein

R

rhilge

Mitglied
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.

Code:
        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.
 
H

httpdigest

Top Contributor
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.
 
R

rhilge

Mitglied
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:
Code:
   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:

Code:
        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! :)
 
Ähnliche Java Themen

Ähnliche Java Themen


Oben