2017-02-13 17 views
0

Привет, я пытаюсь реализовать сервер, работающий с клиентами с несколькими клиентами Проблема в том, что сервер не получает сообщение от входного потока и ждет, пока оно не произойдет. если клиент не закрывает поток после его записи, сервер будет продолжать ждать. После того как клиент отправит сообщение, он попытается прочитать из входного потока, ожидающего ответа, но сервер ждет запроса. Так .. тупиковойJava Socket Communication «deadlock»

Это мой клиент класса

public class Client implements Runnable{ 

... 

@Override 
public void run() { 

    BufferedReader is = null; 
    BufferedWriter os = null; 

    try(Socket socket = new Socket(address.getHostName(), address.getPort());){ 

     String request = String.format("%s-%d-%s",this.destination, this.desiredPlace, this.paymentMethod.toString()); 
     os = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     is = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     PrintWriter pw = new PrintWriter(os, true); 
     pw.write(request); 
     pw.flush(); 
// if I close the stream here the request will be send, but this will close the socket so the I will not receive response. 

     String response; 
     while ((response = is.readLine()) != null){ 
      System.out.println(response); 
     } 

    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      is.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

}

И это мой сервер класса

public void perform() throws IOException, DestionationProcessingException, InterruptedException { 
    try (ServerSocket server = new ServerSocket(port);) { 
     StandalonePayDesk offLinePayDesk = new StandalonePayDesk(ticketManager); 
     this.threadPool.submit(offLinePayDesk); 

     while (true) { 
      Socket socket = server.accept(); 
      RequestHandler handler = new RequestHandler(this.threadPool, offLinePayDesk, this.ticketManager); 
      handler.process(socket); 
     } 
    } 
} 

и RequestHandler класс для обработки каждого клиента

try (BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      PrintWriter writer = new PrintWriter(client.getOutputStream(), true)) { 

     writer.println("hello"); 
     writer.flush(); 

     String line; 
     while ((line = reader.readLine()) != null) { 

      String[] lineTokens = line.split("-"); 
       ... 

Может ли кто-нибудь помочь мне решить эту проблему?

ответ

2
pw.write(request); 

Ваш клиент пишет запрос, но не линию. Ваш сервер читает строку, с readLine(), и будет блокироваться до тех пор, пока не истечет срок действия терминатора линии, что никогда не будет, поэтому он никогда не отправит ответ, поэтому ваш клиент никогда не получит его, поэтому он будет блокироваться навсегда.

изменить выше:

pw.println(request); 
+0

Большое спасибо! я ценю это –