2014-11-13 3 views
0

Я реализую простую архитектуру клиент-сервер, где несколько клиентов должны иметь возможность подключаться к серверу, и строки могут быть обменены между сервером и клиентом.Java-темы не запускаются/работают как ожидалось

Моя идея состоит в том, что у меня будет два потока с каждой стороны: слушатель, постоянно проверяющий, есть ли что-то новое во входном потоке, и поток писателя, который записывает в сокет, если есть что писать.

Однако второй поток даже не запускается ... Отображается только первый sysout.

//start new thread to handle client input 
    new Thread(
      new ServerWorker(clientSocket, this, this.getIdCounter())).start(); 
    System.out.println("server side listener started"); 

    //start new thread to handle client output 
    new Thread(new ServerWorkerListener(clientSocket)).start(); 
    System.out.println("server side writer started"); 

Вот код из ServerWorker:

public void run() { 
    try { 
     OutputStream output = clientSocket.getOutputStream(); 
     while (true) { 
      // output.write(("Pling!\n\n").getBytes()); 

      for (Client tempClient : server.getClientList()) { 
       if ((tempClient.getId() == this.id) 
         && tempClient.isShouldSend()) { 

        output.write((tempClient.getOutputStream() + "\n\n") 
          .getBytes()); 
        tempClient.setInputStream(""); 
        tempClient.setShouldSend(false); 
       } 
      } 

     } 
    } catch (IOException e) { 
     System.out.println("Error in serverWorker"); 
     e.printStackTrace(); 
    } 

} 

Я действительно не знаю, что я не хватает ...

Всего из ServerWorker: общественного класса ServerWorker реализует Runnable {

protected Socket clientSocket = null; 
protected String serverText = null; 
protected int id; 
protected Server server; 

public ServerWorker(Socket clientSocket, Server server, 
     int id) { 
    this.clientSocket = clientSocket; 
    this.serverText = serverText; 
    this.id = id; 
    this.server = server; 
} 

public void run() { 
    try { 
     OutputStream output = clientSocket.getOutputStream(); 
     while (true) { 
      // output.write(("Pling!\n\n").getBytes()); 

      for (Client tempClient : server.getClientList()) { 
       if ((tempClient.getId() == this.id) 
         && tempClient.isShouldSend()) { 

        output.write((tempClient.getOutputStream() + "\n\n") 
          .getBytes()); 
        tempClient.setInputStream(""); 
        tempClient.setShouldSend(false); 
       } 
      } 

     } 
    } catch (IOException e) { 
     System.out.println("Error in serverWorker"); 
     e.printStackTrace(); 
    } 

} 

}

Всего из ServerWorkerListener:

public class ServerWorkerListener implements Runnable { 

private BufferedReader input; 
private Socket clientSocket; 

public ServerWorkerListener(Socket clientSocket) { 
    this.clientSocket = clientSocket; 
    run(); 
} 

@Override 
public void run() { 
    System.out.println("its running"); 
    try { 

     BufferedReader in = new BufferedReader(new InputStreamReader(
       clientSocket.getInputStream())); 

     while (true) { 
      System.out.println("it's looping"); 
      String inputLine = null; 
      if ((inputLine = in.readLine()) != null) { 
       JOptionPane.showMessageDialog(null, inputLine, "InfoBox: " 
         + "Message from client", 
         JOptionPane.INFORMATION_MESSAGE); 

      } 
     } 

    } catch (UnknownHostException e) { 
     System.err.println("Don't know about client"); 
     System.exit(1); 
    } catch (IOException e) { 
     System.err.println("Couldn't get I/O for the connection to client"); 
     System.exit(1); 

    } 
} 

}

+0

Есть ли какой-либо блокирующий код в конструкторе ServerWorkerListener? – Udo

+0

Не могли бы вы опубликовать источник всех классов ServerWorker и ServerWorkerListener? – Michal

+0

Обновлено и спасибо, что посмотрели! – user3616457

ответ

0

Вы призываете run() внутри конструктора ServerWorkerListener, который вы не должны делать. Новый поток должен вызывать run(), в противном случае, поскольку он содержит бесконечный цикл, он никогда не вернется из конструктора и, следовательно, никогда не вызывает конструктор Thread, не говоря уже о его методе запуска. Поэтому при удалении run() вызов из конструктора должен решить проблему.

Смежные вопросы