2011-10-21 39 views
2

我在学习使用Java的套接字,并且成功将数据发送到在我自己的机器中运行的ServerSocket。当我尝试使用readline从这个套接字读取(所以我只能回应我自己发送的消息)我的程序挂起,不会返回。BufferedReader 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前摆一类。这里是代码:

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); 
    } 

} 

我的服务器非常简单。连接建立后,它进入这个循环并保持在这里,直到我关闭客户端(由于无限循环)。之后,一些异常处理将其返回到连接开始之前的位置。

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

我看不到我在想什么。

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

THX

+1

服务器是做什么的?如果它没有回复你的消息,或者没有刷新它的写入,那么当然客户端将无限期地等待直到从服务器发送一行。 –

+0

我将用服务器的无限循环编辑帖子,同时回复消息 –

回答

11

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

+1

就是这样!在ostream.writeUTF(“ACK:”+ msg)中放置'\ n';工作。现在唯一的疑问是,我的客户端上出现了2个不可打印的字符。他们能成为什么? –

+0

您可以在一侧以UTF编写,并在另一侧使用平台的默认编码进行读取。始终使用Writer来写字符。始终使用指定特定的显式编码的OutputStreamWriter来封装输出流。执行相同的操作:始终使用Reader,并使用指定相同特定编码的InputStreamReader来包装输入流。 –

+0

@Thiago Moraes它们是由Javadoc中记录的writeUTF()放置的长度字前缀。另请参阅我的答案。 – EJP

1
cli.ostream.writeUTF("Teste"); 

不应该这是包含一个新的生产线?否则,读取方法将等待我认为的新行。

也如建议您可以尝试写入后冲洗ostream。

+0

ostream是输出流。 OP表示服务器正确接收到此消息。问题是客户端没有收到来自服务器的答案。 –

+0

我刷新了ostream并且现在给我的字符串添加了一个'\ n',之前我没有这样做。但问题仍然存在相同=/ –

1

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

+0

我相信我明白你的意思,但考虑到我不是英语母语的人,所以我需要Unicode支持。在我的情况下,将推荐什么类的组合? –

+0

@ThiagoMoraes我有一个错字。使用读者和作家,并指定字符集。 – EJP

相关问题