/*
需求:
在客户端,输入用户名,如果该用户名在系统数据库存在,则提示欢迎登陆,如果不存在,则提示用户不存在,每个IP限制登陆三次
*/
import java.io.*;
import java.net.*;
class LoginClient
{
public static void main(String[] args)throws Exception
{
Socket s=new Socket("192.168.100.100",10001);
String line=null;
String info=null;
//创建客户端源为控制台的读入流
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//创建打印流,将控制台读入的数据打印到网络输出流
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
//创建带缓冲器的网络输入流,用来读取服务端反馈的数据
BufferedReader bufin=new BufferedReader(new InputStreamReader(s.getInputStream()));
while(true){
line=br.readLine();
if(line==null)
break;
if("over".equals(line))
break;
pw.println(line);
//将服务器端反馈的信息输出在控制台上
info=bufin.readLine();
System.out.println(info);
if(info.contains("欢迎"))
break;
//br.close();
}
s.close();
}
}
class LoginServer
{
public static void main(String[] args)throws Exception
{
//创建服务器端Socket服务
ServerSocket ss=new ServerSocket(10001);
while(true){
//当服务器端接收到一个客户端对象时,则开启一个子线程,处理客户端请求
Socket s=ss.accept();
new Thread(new LoginUser(s)).start();
}
}
}
class LoginUser implements Runnable
{
private Socket s;
LoginUser(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 brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
//创建服务器端读取流缓冲器,关联文件读取流,来读取指定文件数据
BufferedReader br=new BufferedReader(new FileReader("D:\\Mysql.txt"));
//创建打印流,关联客户端网络输出流,来将反馈信息打印到网络输出流传递给客户端
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
String name=brIn.readLine();
String line=null;
//添加标记
boolean flag=false;
//判断客户端输入的用户名称,在服务器端数据库是否存在
while((line=br.readLine())!=null){
if(name.equals(line)){
flag=true;
break;
}
}
if(flag==true){
System.out.println(name+"已登陆");
pw.println(name+":欢迎登陆");
break;
}
else{
System.out.println(name+":尝试登陆");
pw.println(name+"用户不存在");
break;
}
}
s.close();
}
catch(Exception e){
throw new RuntimeException("用户校验失败");
}
}
}
服务器端主线程进来后就一直处于等待状态了,而客户端,我把while循环放在开始读控制台输入的地方,依然是不行,按理说如果客户端输入的用户名不符,客户端应该是可以再次输入的,因为客户端线程还没有断开,会去重复等待读控制台输入的内容,直到达到3次,才会被服务器端关闭socket,可是我运行第二次就抛异常了,很不解!
|