2016-12-08 3 views
0

Я впервые заглядываю в сокеты. Точка проекта заключается в том, что клиент может получить доступ к списку контактов (CSV) на сервере, написав «getall» и выйдя из программы только через эту команду («Выход»).Розетки - Нет непрерывного ответа

Проблема заключается в том, что клиент может только написать команду и получить список один раз, а затем сервер больше не отвечает на вход клиента.

Вот сокет код для сервера и клиента соответственно:

Сервер:

public class CatalogueServer extends CatalogueLoader { 

ServerSocket serverSocket; 
ArrayList<CatalogueEntry> catalogue; 

public void startServer(int port, String catalogueFile) { 

    catalogue = loadLocalCatalogue(catalogueFile); 

    try { 
     serverSocket = new ServerSocket(port); 

     while (true) { 
      Socket clientSocket = serverSocket.accept(); 

      new Thread(
        new Runnable() { 
         public void run() { 
          try { 

           InputStream inputStream = clientSocket.getInputStream(); 
           InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8"); 

           BufferedReader BR = new BufferedReader(inputStreamReader); 

           OutputStream outputStream = clientSocket.getOutputStream(); 
           PrintWriter PW = new PrintWriter(outputStream); 
           String clientInput; 

           while ((clientInput = BR.readLine()) != null) { 
            System.out.println(clientInput); 
            if (clientInput.equals("getall")) { 
             System.out.println(printCatalogue(catalogue)); 
             PW.println(printCatalogue(catalogue)); 
             PW.flush(); 
             break; 
            } else if (clientInput.equals("exit")) { 
             clientSocket.close(); 
             BR.close(); 
             PW.close(); 
             break; 
            } else { 
             PW.flush(); 
             break; 
            } 
           } 
           PW.close(); 
          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
      ).start(); 
     } 
    } catch (Exception i) { 
     i.printStackTrace(); 
    } 
    } 
} 

Клиент:

public class TestClient { 

public static void main(String[] args) { 

    try { 
     Socket socket = new Socket("localhost", 5253); 
     OutputStream outputStream = socket.getOutputStream(); 
     InputStream inputStream = socket.getInputStream(); 
     InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 

     BufferedReader BR = new BufferedReader(inputStreamReader); 

     while (true) { 

      String clientInput; 
      String serverFeedback; 

      PrintWriter PW = new PrintWriter(outputStream); 

      Scanner inputScan = new Scanner(System.in, "UTF-8"); 
      clientInput = inputScan.nextLine(); 

      PW.println(clientInput); 
      PW.flush(); 

      while ((serverFeedback = BR.readLine()) != null) { 
       System.out.println(serverFeedback); 
      } 

      if (clientInput.equals("exit")) { 
       PW.close(); 
       socket.close(); 
       break; 
      } 
      PW.close(); 
     } 
    } 
    catch (IOException e){ 
     e.printStackTrace(); 
    } 
    } 
} 

Я попытался чередуя положение и возобновление t читателей и писателей. Но я не уверен, где именно начинается эта проблема.

ответ

1

Когда вы

 while ((serverFeedback = BR.readLine()) != null) { 
      System.out.println(serverFeedback); 
     } 

Вы читаете, пока не будет достигнут конец потока, то есть до тех пор, пока не осталось ничего. Таким образом, после этого ничего не происходит.

Если вы хотите повторно использовать соединение, вам необходимо написать код, который не использует этот шаблон, и читать только до тех пор, пока он не прекратит чтение.