本帖最后由 杨兴庭 于 2013-7-29 11:06 编辑
代码很长,问题很短
运行下面的代码
先运行服务器,再运行客户端。然后在客户端直接输入ctrl+c
打印结果为null ...正在尝试登陆
java.net.SocketException:Connection reset
已经判断了当服务器读取到null的时候结束循环,为什么还会读取下面的程序呢
/*
客户端通过键盘录入用户名。
服务端对这个用户名进行校验。
如果该用户存在,在服务端显示xxx,已登陆。
并在客户端显示 xxx,欢迎光临。
如果该用户存在,在服务端显示xxx,尝试登陆。
并在客户端显示 xxx,该用户不存在。
最多就登录三次。
*/
import java.io.*;
import java.net.*;
//客户端
class SocketDemo4
{
public static void main(String[] args)
{
try
{
Socket s = new Socket("127.0.0.1",10000);
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
BufferedReader bfr2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
for (int x = 0;x<3 ;x++ )
{
//line = bfr.readLine();
// if(line == null)//如果不执行这个代码,当客户端按ctrl+c的时候,会发送一个null到服务器
break;
pw.println(line);
String str =bfr2.readLine();
System.out.println(str);
if(str.contains("欢迎"))
break;
}
bfr.close();
s.close();
}
catch (Exception e)
{
System.out.println(e.toString());
}
}
}
class ServerSocketDemo4
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10000);
while(true)
{
Socket s = ss.accept();
new Thread(new ServerThread(s)).start();
}
}
}
class ServerThread implements Runnable
{
Socket s ;
ServerThread(Socket s)
{
this.s = s;
}
public void run()
{
try
{ String ip = s.getInetAddress().getHostAddress();
System.out.println(ip);
for (int x = 0;x<3 ; x++)
{
BufferedReader bfr2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
String line = null;
String str = null;
BufferedReader bfr = new BufferedReader(new FileReader("user.txt"));
line = bfr2.readLine();
if (line == null)//这里已经判断了一次,null的话break,为什么还会执行一次下面的代码
break;
boolean flag = false;
while((str = bfr.readLine())!=null)
{
if(str.equals(line))
{
System.out.println(line+"已登录");
pw.println("欢迎光临");
flag = true;
break;
}
}
if(flag)
break;
else
{
pw.println(line+"...用户名不存在");
System.out.println(line+"...正在尝试登陆");
}
bfr.close();
}
s.close();
}
catch (Exception e)
{
System.out.println(e.toString());
}
}
}
|