关于服务器客户端之间的 while((str=br.readline())!=null){//输出readline}问题

while((str=br.readline())!=null){//输出readline,输出“测试成功”}貌似这句话在单方读取数据时可以的,即当readline到了流... while((str=br.readline())!=null){//输出readline,输出“测试成功”} 貌似这句话在单方读取数据时可以的,即当readline到了流结尾时(readline取到null时),自动会结束while循环;而在服务器与客户端相互读取数据时,当readline到流结尾时,照理说readline==Null了,应该结束while循环了,但是程序会一直卡在readline()那里,感觉一直取不到null,但是又不会输出大括号里的“测试成功”
我先前貌似也看到过,据说在服务器与客户端之间用readline时,readline就一直不会取到null,即使读到了流结尾。有没有好的解决办法,难道这个readline()不能解决这方面的问题啊?
求高人指教,求指导
这里大小写暂时忽略,我手写错了 编译器里没写错,因为编译通过了
展开
 我来答
gaoyongbo026
推荐于2018-04-04 · TA获得超过297个赞
知道小有建树答主
回答量:227
采纳率:100%
帮助的人:107万
展开全部
首先要明白什么叫流结束,对于读取文件流,读到文件末尾算结束,
但对于socket流,把某次写入到该流的字符读取完能认为该socket流结束吗?
不能,因为这个流还存在,即使流中已经没有数据,但仍然可以继续写出和读入,那么程序自然会继续读流,而流真正的结束就是关闭
tespo
2010-08-27 · TA获得超过250个赞
知道答主
回答量:236
采纳率:0%
帮助的人:219万
展开全部
约定用某个字符串(如"bye")表示流结束
即while(!(str=br.readLine()).equals("bye")){...}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
大时代暑
2010-08-27 · TA获得超过2.5万个赞
知道大有可为答主
回答量:4111
采纳率:0%
帮助的人:4813万
展开全部
1。约定用某个字符串(如"bye")表示流结束的确是个办法
2。之所以出现这种情况,是因为你用的是阻塞式IO,你 可以采用非阻塞式IO

给你一个约定用某个字符串表示流结束的例子

import java.net.*;
import java.io.*;

public class TalkClient {
Socket so = null;
BufferedReader br = null;
BufferedReader bdr = null;
PrintWriter pw = null;
String s = null;
String str = null;
boolean flag = false;
public TalkClient(){
try {
so = new Socket("127.0.0.1", 38888);
}catch(UnknownHostException e){
System.out.println("如果无法确定指定主机的 IP 地址");
}catch(IOException e){
e.printStackTrace();
}
}

public static void main(String[] args) {
new TalkClient().request();

}

public void request(){
try {
pw = new PrintWriter(so.getOutputStream(), true);
br = new BufferedReader(new InputStreamReader(so.getInputStream()));
bdr = new BufferedReader(new InputStreamReader(System.in));

} catch (IOException e) {
e.printStackTrace();
}
communicate();
}
public void communicate(){
try {
while(!flag){
str = bdr.readLine();
pw.println(str);
s = br.readLine();
System.out.println("Server:" + s);
if(str.equals("Good bye")){
flag = true;
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(so != null){
so.close();
}
if(pw != null){
pw.close();
}
if(br != null){
br.close();
}
if(bdr != null){
bdr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}

}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小张爱学习168
2012-11-02
知道答主
回答量:5
采纳率:0%
帮助的人:3.3万
展开全部
while ((line = br.readLine()) != null&&line.length()!=0) {
System.out.println(line);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式