请教一个java socket的问题

testpwd 2010-09-25 05:03:35
有这样一个例子:


public class EchoServer
{
public static void main(String[] args)
{
try
{
ServerSocket s = new ServerSocket(8189);
Socket incoming = s.accept();
try
{
InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();

Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream, true);

out.println("hello! enter BYE to exit.");

boolean done = false;

while(!done && in.hasNextLine())
{
String line = in.nextLine();
out.println("Echo:" + line);
if(line.trim().equals("BYE"))
done = true;
}
}
finally
{ incoming.close();}
}
catch(IOException e)
{
}

}
}


程序运行后,用telnet 127.0.0.1 8189连接服务器,然后输入
Hello Server
服务器返回
Echo:Hello Server

然后再输入BYE
服务器返回
Echo:BYE

有个问题是:循环的条件是 while(!done && in.hasNextLine())
当第一次输入Hello Server之后,in.hasNextLine()应该为false了啊?为什么没有退出循环呢?
...全文
81 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
testpwd 2010-09-26
  • 打赏
  • 举报
回复
我调试时发现,程序第一次执行到 while(!done && in.hasNextLine()) 时,如果用户没有输入,也会阻塞。用户输入后循环条件为真,然后执行到 out.println("Echo:" + line); 时也阻塞,直到用户再次输入。只有当用户断开时in.hasNextLine()才为false。
xiaochun91103 2010-09-26
  • 打赏
  • 举报
回复
原因只有一个那就是Scanner的hasNextLine()方法返回True。
hasNextLine()方法描述如下:如果在此扫描器的输入中存在另一行,则返回 true。在等待输入信息时,此方法可能阻塞。扫描器不执行任何输入。

也就是说在第一次你输入完Hello Server之后,程序会阻塞在那边,等待用户的继续输入,程序才会继续往下跑。
testpwd 2010-09-26
  • 打赏
  • 举报
回复
请这个兄弟仔细看我的问题,done为false,!done为true,&&操作是同时为true才循环,我就是问

当第一次输入Hello Server之后,in.hasNextLine()应该为false了,应该退出循环。

[Quote=引用 1 楼 xblue3 的回复:]
while(!done && in.hasNextLine())
仔细看看&&,同时成立
!!!!done否操作
[/Quote]
Apeipo 2010-09-26
  • 打赏
  • 举报
回复
5L说的没错.是hasNextLine阻塞了..我理解错了.
Apeipo 2010-09-25
  • 打赏
  • 举报
回复
in.nextLine是阻塞型的方法.也就是你没输入,程序就会停在那等待你输入.所以执行完第一次循环后,Server停在in.nextLine等待输入.当然不会退出.当输入BYE的时候 循环条件不满足.退出.
clariones 2010-09-25
  • 打赏
  • 举报
回复
lz的问题没错
第一次循环开始前,done=false(初始化)
打印 Hello Server后,因为不是“BYE”,所以done还是 false
现在结果就是 while(!false && X ) 成立了 也就是说,X=true

第二次退出,是因为 line.trim().equals("BYE")=true,所以done=true,所以while(!true && X ) 不成立了

所以,第一次没退出的原因,就是 in.hasNextLine()=true, 可以加个打印试试。
至于为啥是true,就要看看代码了。
meadking 2010-09-25
  • 打赏
  • 举报
回复
while(!done && in.hasNextLine())
仔细看看&&,同时成立
!!!!done否操作

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧