Client reagiert bei Threadserver nicht.

eclipseworker

Bekanntes Mitglied
Der Client nimmt offenbar eine Verbindung auf, dann kann ich in die Konsole aber nichts mehr eingeben - was kann ich da tun?
Java:
/*--- Handler ---*/
// all nessary imports
public  class Handler implements Runnable {
            private final Socket socket;
            private long number;
            public Handler(Socket socket, long number) { this.socket = socket; this.number = number;}
           
            public void run() {
                try ( Socket clientSocket = socket;
                       PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);                
                       BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream()));
                    ) {
                        String inputLine;
                        while ((inputLine = in.readLine()) != null) {
                                    if(inputLine.equals("Bye.")){
                                        out.println("Bye.");
                                        break;
                                    }
                                    out.println(number+": "+inputLine);
                                }
                            } catch (IOException e) {
                                System.out.println("Exception caught when trying to listen on port "
                                    + this.socket.getPort() + " or listening for a connection");
                                System.out.println(e.getMessage());
                            }
           }
}

/*--- NetworkService ---*/
// all nessary imports
public class NetworkService implements Runnable {
               private final ServerSocket serverSocket;
               private final ExecutorService pool;

               public NetworkService(int port, int poolSize)
                   throws IOException {
                 serverSocket = new ServerSocket(port);
                 pool = Executors.newFixedThreadPool(poolSize);
               }
              
               public static void main(String[] args) throws IOException {
                   
                    if (args.length < 2) {
                        System.err.println("Usage: java NetworkServer <port number> <poolsize>");
                        System.exit(1);
                    }

                    int portNumber = Integer.parseInt(args[0]);
                    int poolsize = Integer.parseInt(args[1]);
                    new NetworkService(portNumber, poolsize).run();
                   
               }

               public void run() { // run the service
                 try {
                    long number=1;
                   for (;;) {
                     pool.execute(new Handler(serverSocket.accept(), number++));
                   }
                 } catch (IOException ex) {
                     System.err.println(ex);
                   pool.shutdown();
                 }
               }
             }
/*----Client---*/
// all nessary imports
public class Client {

    public static void main(String[] args) throws IOException {
       
        if (args.length != 2) {
            System.err.println(
                "Usage: java Client <host name> <port number>");
            System.exit(1);
        }

        String hostName = args[0];
        int portNumber = Integer.parseInt(args[1]);
        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;

                while ((fromServer = in.readLine()) != null) {
                    System.out.println("Server: " + fromServer);
                    if (fromServer.equals("Bye."))
                        break;
                   
                    fromUser = stdIn.readLine();
                    if (fromUser != null) {
                        System.out.println("Client: " + fromUser);
                        out.println(fromUser);
                    }
                }
            } catch (UnknownHostException e) {
                System.err.println("Don't know about host " + hostName);
                System.exit(1);
            } catch (IOException e) {
                System.err.println("Couldn't get I/O for the connection to " +
                    hostName);
                System.exit(1);
            }
       
    }
}
 

Flown

Administrator
Mitarbeiter
Ist doch ganz einfach erklärt:
- Der Server wartet, dass etwas ankommt
- Der Client wartet, dass etwas ankommt

Die Logik in deinem Client sollte anders aussehen (Pseudocode):
Code:
do {
  userInput = input.read();
  server.send(userInput);
  serverOutput = server.read();
} while(serverOutput != byeMsg);
 

Robat

Top Contributor
Wenn du in deine Client-Klasse schaust siehst du auch warum.

Java:
while((formServer = in.readLine()) != null) {
    System.out.println("Server: " + formServer);

     // userinput kommt hier
}

in.readLine() ist blockierend, d.h. er geht dort erst weiter wenn vom Server eine Nachricht empfangen wurde.
In deinem Server-Code schreibst du aber erst eine Nachricht an den Client, wenn er vom Client eine Nachricht empfangen hat.

Die Logik blockiert sich also gegenseitig.

Um das zu beheben, könntest du nach dem Connecten des Clients einfach eine Nachricht an den Client senden und erst dann mit der eigentlichen Logik (deiner Schleife) weitermachen.
Du könntest auch deine Reihenfolge abändern in erst Eingabe des Users, dann an den Server senden und erst dann liest du die Nachricht vom Server.
Eine andere - schönere - Möglichkeit wäre die Logik für den Userinput in einen separaten Thread auszulagern.

Edit: Upsi da war wohl jemand schneller :rolleyes:
 

eclipseworker

Bekanntes Mitglied
Danke an alle. Das hat das Problem gelöst. Mein Handler ist jetzt:
Java:
            public void run() {
                try ( Socket clientSocket = socket;
                       PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);               
                       BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream()));
                    ) {
                        String inputLine;
                        out.println("Hello "+number);
                        while ((inputLine = in.readLine()) != null) {
                                    if(inputLine.equals("Bye.")){
                                        out.println("Bye.");
                                        break;
                                    }
                                    out.println(number+": "+inputLine);
                                }
                            } catch (IOException e) {
                                System.out.println("Exception caught when trying to listen on port "
                                    + this.socket.getPort() + " or listening for a connection");
                                System.out.println(e.getMessage());
                            }
           }
Und damit klappt es jetzt.
 

Ähnliche Java Themen

Neue Themen


Oben