/*
客户端并发登陆
客户通过键盘录入用户名,服务端对这个用户名进行校验。
如果用户名存在,在服务端显示xxxy已登录,并在客户端显示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.0.3",10000);
//获取键盘读取流
BufferedReader bufr=
new BufferedReader(new InputStreamReader(System.in));
//获取Socket输出流
PrintWriter out= new PrintWriter(s.getOutputStream(),true);
//获取Socket输入流
BufferedReader bufIn=
new BufferedReader(new InputStreamReader(s.getInputStream()));
//判断用户登陆的次数 最多3次
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);
//如果登陆成功,则不再循环判断
if (info.contains("欢迎光临"))
break;
}
bufr.close();
s.close();
}
}
//定义客户端并发执行的线程
class UserThread implements Runnable
{
private Socket s;
UserThread(Socket s)
{
this.s=s;
}
public void run()
{
//获取客户端的ip
String ip =s.getInetAddress().getHostAddress();
System.out.println(ip);
try
{
//服务端循环判断登陆次数 最多3次
for (int x=0;x<3 ;x++ )
{
//定义文件读取流
BufferedReader bufr = new BufferedReader(new FileReader("user.txt"));
//获取Socket读取流
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
//获取Socket输出流
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
//读取用户输入的数据
String line = bufIn.readLine();
if (line==null)
{
break;
}
String name = null;
boolean flag = false;
//循环读取文件中的数据和用户输入的数据比较
while ((name=bufr.readLine())!=null)
{
if (name.equals(line))
{
flag =true ;
break;
}
}
if(flag)
{
out.println(name+",欢迎光临");
System.out.println(name+",已登录");
break;
}
else
{
System.out.println(line+",尝试登陆");
out.println(line+",不存在");
}
}
s.close();//注意:读取流不能关
}
catch (Exception e)
{
throw new RuntimeException("校验失败");
}
}
}
class LoginServer
{
public static void main(String[] args) throws Exception
{
//建立服务端服务
ServerSocket ss = new ServerSocket(10000);
//循环判断是否有服务连接
while(true)
{
//获取客户端对象
Socket s =ss.accept();
//开启为客户端服务的线程
new Thread(new UserThread(s)).start();
}
}
} |