黑马程序员技术交流社区
标题:
为什么这段代码键入空值还是会输出?
[打印本页]
作者:
黑马连家华
时间:
2012-7-25 13:45
标题:
为什么这段代码键入空值还是会输出?
本帖最后由 黑马连家华 于 2012-8-13 17:19 编辑
模拟用户登录的小程序,只有三次机会
import java.io.*;
import java.net.*;
class TCPClient
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("127.0.0.1",12000);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader brin = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
for (int x = 0;x < 3 ;x++ )
{
String line = br.readLine();
//读取键盘录入
if (line == null)
//当键盘录入为空,退出登录操作,但为什么我的好像没什么效果?还能继续录入
{
break;
}
out.println(line);
String linein = brin.readLine();
System.out.println("Info : "+linein);
if (linein.contains("欢迎"))
//得到服务端的反馈,里面包含 欢迎 时,退出登录操作.这个break怎么又好用,而上面的break不起作用?
{
break;
}
}
br.close();
brin.close();
s.close();
}
}
class TCPLogin implements Runnable
{
private Socket s;
TCPLogin(Socket s)
{
this.s = s;
}
public void run()
{
System.out.println(s.getInetAddress().getHostAddress()+".connected");
try
{
for (int x = 0;x < 3;x++)
{
BufferedReader brin = new BufferedReader(new InputStreamReader(s.getInputStream()));
String data = brin.readLine();
if (data == null)
//得到客户端的数据,当内容为空,结束三次循环,并在下面关闭Socket服务,这个break又不好用了...
{
break;
}
BufferedReader br = new BufferedReader(new FileReader("UserInfo.ini"));
String line = null;
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
boolean flag = false;
while ((line = br.readLine()) != null)
{
if (line.equals(data))
{
flag = true;
break;
}
}
if (flag)
{
System.out.println(data+",已登录");
out.println(data+",欢迎");
break;
}
else
{
System.out.println(data+",尝试登录");
out.println(data+",用户不存在");
}
}
s.close();
//循环结束后关闭服务
}
catch (Exception e)
{
throw new RuntimeException("用户校验失败");
}
}
}
class TCPServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(12000);
while (true)
{
Socket s = ss.accept();
new Thread(new TCPLogin(s)).start();
}
}
}
//找了N遍,还是不知道为什么,别看代码有点长,其实很简单,我觉得一定是我哪里马虎了,或者有其它知识点我没注意到,请大家帮帮忙.这个程序我看两天了
现在我把毕老师的源码贴上
/*
客户端通过键盘录入用户名。
服务端对这个用户名进行校验。
如果该用户存在,在服务端显示xxx,已登陆。
并在客户端显示 xxx,欢迎光临。
如果该用户存在,在服务端显示xxx,尝试登陆。
并在客户端显示 xxx,该用户不存在。
最多就登录三次。
*/
import java.io.*;
import java.net.*;
class LoginClient
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("192.168.1.254",10008);
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
for(int x=0; x<3; x++)
{
String line = bufr.readLine();
if(line==null)
break;
out.println(line);
String info = bufIn.readLine();
System.out.println("info:"+info);
if(info.contains("欢迎"))
break;
}
bufr.close();
s.close();
}
}
class UserThread implements Runnable
{
private Socket s;
UserThread(Socket s)
{
this.s = s;
}
public void run()
{
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
try
{
for(int x=0; x<3; x++)
{
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
String name = bufIn.readLine();
if(name==null)
break;
BufferedReader bufr = new BufferedReader(new FileReader("user.txt"));
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
boolean flag = false;
while((line=bufr.readLine())!=null)
{
if(line.equals(name))
{
flag = true;
break;
}
}
if(flag)
{
System.out.println(name+",已登录");
out.println(name+",欢迎光临");
break;
}
else
{
System.out.println(name+",尝试登录");
out.println(name+",用户名不存在");
}
}
s.close();
}
catch (Exception e)
{
throw new RuntimeException(ip+"校验失败");
}
}
}
class LoginServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10008);
while(true)
{
Socket s = ss.accept();
new Thread(new UserThread(s)).start();
}
}
}
作者:
黑马连家华
时间:
2012-7-25 15:17
等不到答案么
作者:
李东升
时间:
2012-7-25 15:42
本帖最后由 李东升 于 2012-7-25 20:31 编辑
这个你输入空的,也会登陆,只是因为readLine()方法一次读取一行,包括你按下的enter键也会读取。所以怎么获取都不可能为空。同样下面的也是readLine()方法,也就不会走if语句里面的,break也会失效。
你把if (line == null)
改成if(line.trim().equals(""))试下。
另外,java中的空值,空地址还是有区别的,不是一个null就完事了。
作者:
肖琦
时间:
2012-7-25 15:46
代码程序中,你不可能获取到null的,你点回车符也是有输入的是"\r\n"
作者:
黑马刘涛
时间:
2012-7-25 19:04
readline方法是能自动去掉录取字符串前面空白及回车换行的
作者:
李菁
时间:
2012-7-25 23:17
String line = br.readLine();//读取键盘录入
永远不会录入空值啊,readLine方法一次读取一行,回车符也是默认"\r\n"
if (line == null)//当键盘录入为空,退出登录操作,但为什么我的好像没什么效果?还能继续录入
{
break;
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2