2017-02-13 77 views
0

嗨我想实现与乘客客户端运行的服务器 问题是,服务器没有收到来自inputstream的消息,并等待它发生。如果客户端在写入数据流后没有关闭流,服务器将继续等待。客户端发送消息后,他尝试从输入流中读取等待响应,但服务器正在等待请求。所以..死锁Java Socket通信“死锁”

这是我的客户端类

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

非常感谢您!我很感激 –