socket通信中,怎么样正常跳出 while ((line = br.readLine()) != null){}

时间:2022-08-17 15:39:46
在网络通讯过程中,下面这段是服务器接受到客户端后的程序。
我不知道while循环体判断语句br.readLine() ! = null; 什么时候会不满足,到达br.close();

public void run() {
sockedOut("你已经连接到本服务器了");
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(
socket.getInputStream(),"UTF-8"));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
ChatManager.getChatManager().publish(this, line);
}
br.close();
System.out.println("A方式,断开了一个客户端链接");
ChatManager.getChatManager().remove(this);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
System.out.println("B方式,断开了一个客户端链接");
ChatManager.getChatManager().remove(this);
e.printStackTrace();
}
}

我试过,只有当把客户端关闭后,上述循环体出错,进入到catch (IOException e) ,然后跳出run().
始终没有发现什么状态下会正常进行到 br.close();
while ((line = br.readLine()) != null) {
System.out.println(line);
ChatManager.getChatManager().publish(this, line);
}
br.close();

5 个解决方案

#1


按理说,BufferedReader 类的readLine()方法,为读取一行文本,若无数据可读则返回 null。
而我在客户端,不发送数据时,这上面的服务器端   
    语句 while ((line = br.readLine()) != null)  是不是不满足啦,应该跳出while( ){  } 的啊。

为什么总是满足(  ( line = br.readLine() )  !=  null  ),到不了br.close()?
while ((line = br.readLine()) != null) {
   //这里是处理语句
}
 //readLine() = null时
 br.close();

#2


是不是只有 消除了套接字 socked后,接“等效成读取、关闭文件”后,才会有 “ br.readLine() == null;” 成立?
真的不懂这个BufferReader在socked中的含义。

#3


具体为啥没测试过,提供一些思路:socket通信中服务器要想知道什么时候接收结束一般两个方法:加特殊标志符号、提前告知传输数据长度。

#4


我是想知道为什么在新线程的run()方法中,while ((line = br.readLine()) != null) {
   //这里是处理语句
}会一直循环。

#5


有可能阻塞了,http://blog.csdn.net/fw0124/article/details/41227543

#1


按理说,BufferedReader 类的readLine()方法,为读取一行文本,若无数据可读则返回 null。
而我在客户端,不发送数据时,这上面的服务器端   
    语句 while ((line = br.readLine()) != null)  是不是不满足啦,应该跳出while( ){  } 的啊。

为什么总是满足(  ( line = br.readLine() )  !=  null  ),到不了br.close()?
while ((line = br.readLine()) != null) {
   //这里是处理语句
}
 //readLine() = null时
 br.close();

#2


是不是只有 消除了套接字 socked后,接“等效成读取、关闭文件”后,才会有 “ br.readLine() == null;” 成立?
真的不懂这个BufferReader在socked中的含义。

#3


具体为啥没测试过,提供一些思路:socket通信中服务器要想知道什么时候接收结束一般两个方法:加特殊标志符号、提前告知传输数据长度。

#4


我是想知道为什么在新线程的run()方法中,while ((line = br.readLine()) != null) {
   //这里是处理语句
}会一直循环。

#5


有可能阻塞了,http://blog.csdn.net/fw0124/article/details/41227543