BufferedReader readLine方法挂起并阻止程序

我正在尝试使用Java学习套接字,并且我成功地将数据发送到在我自己的机器上运行的ServerSocket。 当我尝试使用readline从这个套接字读取时(所以我可以回显我自己发送的消息)我的程序挂起并且不会返回。

这是代码:

public static void main(String[] args) throws UnknownHostException, IOException { TCPClient cli = new TCPClient("127.0.0.1", "15000"); try { cli.ostream.writeUTF("Teste"); String echo = cli.istream.readLine(); //it hangs in this line System.out.println(echo); } 

TCPClient是我定义的类,所以我可以在我的homwework上使用swing之前在更简单的界面上测试我的程序。 这是代码:

 public class TCPClient { public DataOutputStream ostream = null; public BufferedReader istream = null; public TCPClient(String host, String port) throws UnknownHostException { InetAddress ip = InetAddress.getByName(host); try { Socket socket = new Socket(host, Integer.parseInt(port)); ostream = new DataOutputStream(socket.getOutputStream()); istream = new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch (IOException ex) { Logger.getLogger(TCPClient.class.getName()).log(Level.SEVERE, null, ex); } } 

我的服务器非常简单。 建立连接后,它进入此循环并保持在此直到我关闭客户端(因为无限循环)。 之后,一些exception处理将其返回到连接开始之前的点。

  while(true){ String msg = istream.readLine(); System.out.println("Arrived on server: " + msg); //just works on debug ostream.writeUTF("ACK: " + msg); ostream.flush(); } 

我不知道我错过了什么。

PS:奇怪的是,如果我调试服务器,我可以看到消息到达那里(我可以打印它,例如),但如果我只运行这段代码,这是不可能的。 这是否有一些我忽略的并发关系?

谢谢

问题是readLine尝试读取一行。 在确定已到达行尾之前,它不会返回该行。 这意味着它需要换行符或通信结束。 由于服务器不发送任何换行符并且不关闭流,因此客户端无限期地等待。

 cli.ostream.writeUTF("Teste"); 

这不应该包含新的一行吗? 否则read方法将等待我想的新行。

同样按照建议你可以尝试在写入后刷新ostream。

writeUTF()不写一行。 见Javadoc。 writeUTF()用于readUTF()。 读者可以和作家一起使用。 因此,将DataOutputStream更改为BufferedWriter并调用write()然后调用newline()。