Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client)

Käsekuchen

Mitglied
Java:
import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;

public class server {
    
    public static void main(String[] args) {
        try (ServerSocket ss = new ServerSocket(5554)) {
            while (true) {
                try (Socket connection = ss.accept();
                     OutputStream os = connection.getOutputStream();
                     InputStream is = connection.getInputStream();
                     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
                     BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
                  
                    String zeile;
                    while ((zeile = br.readLine()) != null) {
                        System.out.println("Empfangen vom Client: " + zeile);
                        bw.write("OK\n");
                        bw.flush();
                    }
                    
                    System.out.println("Client hat Verbindung geschlossen");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Code:
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class client {
    public static void main(String [] args) {
        try(Socket connection = new Socket("localhost",5554);
        
            Scanner s = new Scanner(System.in);
          
              OutputStream os = connection.getOutputStream();
              InputStream is = connection.getInputStream();
              BufferedReader br = new BufferedReader(new InputStreamReader(is));
              BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));)
                {
                    
                    while(true) {
                    System.out.println("Gebe etwas ein");
                    String x = s.next();
                    bw.write(x+"\n");
                    bw.flush();
                    
                    System.out.println(br.readLine());
                    }
                }
                catch(IOException e) {
                    e.printStackTrace();
                }
            
        }
      
    }
Ich hab hier immer noch ein Verständnisproblem, wenn ich den Server starte, und dann den Client starte bekomm ich auf der Konsole "Gebe etwas ein" angezeigt, dann kann ich etwas eingeben Enter drücken und dann kommt wieder "Gebe etwas ein" usw. Erst wenn ich das Programm schliesse wird mir "Empfangen vom Client: + meine Eingabe" angezeigt. Warum ist das so ?
 
Ich bin da ehrlich gesagt nicht so firm wie die JVM das handhabt, aber vermutlich wird der Buffer einfach nicht frueher rausgeschrieben. Du kannst mal probieren direkt nach dem println ein System,out.flush() aufzurufen.
 
Also ich kann das Fehlerbild nicht nachvollziehen. System.out wird zwar gepuffert aber das wird nicht so massiv verzögert. Vor allem erscheinen die Ausgaben direkt bei mir. Also sobald ich etwas gesendet habe, bekomme ich das OK beim Client und beim Server steht wenn ich schaue auch das "Empfangen vom Client: " ....

Daher wäre meine Frage: Was genau ist Dein Fehlerbild?

Dein Code habe ich bei mir 1:1 ausgeführt und ich sehe da alles soweit korrekt.
 
Das Problem ist, das kein 'flush' stattfindet. Du solltest für Strings PrintWriter verwenden.
Mal so schnell hingeschludert als Beispiel...

Der Server!
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main(String[] args) throws IOException {

        int portNumber = 9000;

        try (
                ServerSocket serverSocket = new ServerSocket(portNumber);
                Socket clientSocket = serverSocket.accept();
                PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        ) {
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.format("Client: %s%n", inputLine);
                out.println("Bye".equals(inputLine) ? "Bye" : "OK");
                if ("Bye".equals(inputLine)) {
                    break;
                }
            }
        }
    }
}

Der Client:
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {
   
    public static void main(String[] args) throws IOException {

        String hostName = "0.0.0.0";
        int portNumber = 9000;

        try (
                Socket socket = new Socket(hostName, portNumber);
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        ) {
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
           
            String fromServer;
            String fromUser;

            System.out.println("Enter some input, exit with: Bye");
            while ((fromUser = stdIn.readLine()) != null) {
                out.println(fromUser);
               
                fromServer = in.readLine();
                System.out.format("Server: %s%n", fromServer);
                if ("Bye".equals(fromServer)) {
                    break;
                }
            }
        }
    }
   
}

Output vom Client:
Bash:
Enter some input, exit with: Bye
a
Server: OK
b
Server: OK
c
Server: OK
Bye
Server: Bye

Output vom Server:
Bash:
Client: a
Client: b
Client: c
Client: Bye
 

Zurück
Oben