2013-03-20 60 views
5

使用readLine()接收数据时,尽管在发送消息时使用.flush在消息 的末尾放置了“\ n”,但读取我的消息的while循环仍然阻塞。 只有关闭套接字连接时,它才会离开循环。BufferedReader readLine()blocks

这里的客户端代码:

bos = new BufferedOutputStream(socket. 
      getOutputStream()); 
bis = new BufferedInputStream(socket. 
      getInputStream()); 
osw = new OutputStreamWriter(bos, "UTF-8"); 
osw.write(REG_CMD + "\n"); 
osw.flush(); 

isr = new InputStreamReader(bis, "UTF-8"); 
BufferedReader br = new BufferedReader(isr); 

String response = ""; 
String line; 

while((line = br.readLine()) != null){ 
    response += line; 
} 

和服务器的代码:

BufferedInputStream is; 
BufferedOutputStream os; 

is = new BufferedInputStream(connection.getInputStream()); 
os = new BufferedOutputStream(connection.getOutputStream()); 

isr = new InputStreamReader(is); 

String query= ""; 
String line; 

while((line = br.readLine()) != null){ 
    query+= line; 
} 

String response = executeMyQuery(query); 
osw = new OutputStreamWriter(os, "UTF-8"); 

osw.write(returnCode + "\n"); 
osw.flush(); 

我在服务器端代码块while循环。 谢谢。

+0

把你的代码放在try/catch块中并关闭finally块中的streams/connection。 – happy 2013-03-20 10:49:34

+1

这似乎没有问题。你想知道为什么会发生这种行为吗?如何预防它? – Sinkingpoint 2013-03-20 10:54:14

+1

如果你只想读一行为什么使用while循环? – 2013-03-20 10:56:12

回答

10

BufferedReader将继续读取输入,直到它到达结尾(文件结尾或流或源等)。在这种情况下,'结束'是套接字的关闭。所以只要Socket连接打开,您的循环就会运行,并且BufferedReader将等待更多输入,每次达到'\ n'时循环。

+0

mmm我并不认为这个结束是关闭的插座。谢谢。现在我看着它,我误解了文档! – Majid 2013-03-20 10:57:51

+0

当涉及到非文件流的eof时,doc很模糊。 – Sinkingpoint 2013-03-20 10:59:09

+0

这是OP的循环,直到EOS读取,而不是BufferedReader。 – EJP 2013-03-20 21:15:37

3

这是因为在while循环的条件:while((line = br.readLine()) != null)

你读每一个迭代线和LEVE的循环,如果返回的readLine null

如果读取了'\ n',readLine只返回null,如果eof已达到(= socked关闭)并返回一个String。

,如果你想退出上的readLine循环,你可以省略整个while循环UND只是做:

line = br.readLine()

+0

谢谢,我可以试试这个。 – Majid 2013-03-20 10:58:10

0
如果你想获得什么样的插座不

被迫关闭简单地使用ObjectInputStream的和的ObjectOutputStream ..

实施例:

ObjectInputStream ois; 
ObjectOutputStream oos; 

ois = new ObjectInputStream(connection.getInputStream()); 

String dataIn = ois.readUTF(); //or dataIn = (String)ois.readObject(); 

oos = new ObjectOutputStream(connection.getOutputStream()); 
oos.writeUtf("some message"); //or use oos.writeObject("some message"); 
oos.flush(); 

..... 
0

发生这种情况是因为InputStream没有准备好变红,所以它会阻塞in.readLine()。 请试试这个:

boolean exitCondition= false; 

while(!exitCondition){ 
    if(in.ready()){ 
     if((line=in.readLine())!=null){ 
      // do whatever you like with the line 
     } 
    } 
} 

当然,你必须控制exitCondition。

其他选项可以使用nio软件包,它允许读取异步(不阻塞),但它取决于您的需要。

0

我尝试了很多的解决方案,但唯一一个我发现这是不堵的执行是:

BufferedReader inStream = new BufferedReader(new 
InputStreamReader(yourInputStream)); 
String line; 
while(inStream.ready() && (line = inStream.readLine()) != null) { 
    System.out.println(line); 
} 

inStream.ready()返回false如果未来readLine()调用将阻塞执行。

相关问题