Übungsprogramm: Sockets

thelegend27

Aktives Mitglied
Kann mir jemand bitte sagen wieso das nicht funktioniert? (Keine Ausgabe)
Java:
public class JavaApplication39 {

    static int listeningPort;

    public static Runnable getServerRunnable() {
        Runnable serverRunnable = new Runnable() {
            @Override
            public void run() {
                ServerSocket server = null;
                try {
                    server = new ServerSocket(0);
                    listeningPort = server.getLocalPort();
                } catch (IOException ex) {
                    Logger.getLogger(JavaApplication39.class.getName()).log(Level.SEVERE, null, ex);
                }
                while (true) {
                    try {
                        if (server != null) {
                            System.out.println("[Server] " + "while(true)");
                            Socket client = server.accept();
                            Scanner in = new Scanner(client.getInputStream());
                            PrintWriter out = new PrintWriter(client.getOutputStream(), true);

                            String input = in.nextLine();
                            out.write(input + "ruft an!");
                        }

                    } catch (IOException ex) {
                        Logger.getLogger(JavaApplication39.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        };

        return serverRunnable;
    }

    public static Runnable getClientRunnable() {
        Runnable serverRunnable = new Runnable() {
            @Override
            public void run() {            
                while (true) {
                    System.out.println("[Client] " + "while(true)");
                    try (Socket server = new Socket(InetAddress.getLocalHost(), listeningPort)) {

                        PrintWriter out = new PrintWriter(server.getOutputStream(), true);
                        Scanner in = new Scanner(server.getInputStream());

                        out.println("Niemand");
                        System.out.println(in.nextLine());

                    } catch (UnknownHostException ex) {
                        Logger.getLogger(JavaApplication39.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(JavaApplication39.class.getName()).log(Level.SEVERE, null, ex);
                    }

                }
            }
        };
        return serverRunnable;
    }

    public static void main(String[] args) throws InterruptedException {
        Thread serverThread = new Thread(getServerRunnable());
        Thread clientThread = new Thread(getClientRunnable());
        serverThread.start();
        Thread.sleep(2000);
        clientThread.start();

    }
 

Robat

Top Contributor
Lagere Server und Client in zwei separate Klassen aus, die jeweils ihre eigene main-Methode haben und starte beide Klassen dann für sich.
So hast du beides in einer Konsole (geh ich davon aus) .... das funktioniert nicht.

Außerdem solltest du dir noch mal anschauen ob out.write(..) das Richtige für dich ist.

Was auch nicht funktionieren wird, ist den Port auf 0 zu setzen
 

DrZoidberg

Top Contributor
Ich würde "out.println" verwenden anstelle von "out.write". Dadurch wird zum einen automatisch ein Zeilenumbruch an den Text angehängt, was die "Scanner.nextLine" Methode benötigt um das Ende der Zeile zu erkennen.
Zum anderen ruft die "println" Methode auch automatisch die "flush" Methode des PrintWriter auf. Das ist notwendig, damit der Text auch sofort gesendet wird. Die "write" Methode speichert die zu sendenden Daten nämlich erstmal in einem Puffer und schickt sie erst raus, wenn dieser voll ist.
 

thelegend27

Aktives Mitglied
Zum anderen ruft die "println" Methode auch automatisch die "flush" Methode des PrintWriter auf. Das ist notwendig, damit der Text auch sofort gesendet wird. Die "write" Methode speichert die zu sendenden Daten nämlich erstmal in einem Puffer und schickt sie erst raus, wenn dieser voll ist.
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
Verwendet man deshalb nicht diesen Konstruktor?
 

Ähnliche Java Themen

Neue Themen


Oben