前言
这是一个模拟TCP协议下用户登录的小案例。
一、需求
-
服务端可以接收多个用户的请求连接。
-
客户端登录发送用户名和密码,格式:
jack-123456,
用户名和密码通过键盘录入。 -
服务器端接收到用户名和密码之后,查询本地用来存储注册信息的文件
-判断用户名是否存在,如果用户名存在,则判断密码是否正确,如果密码不正确,则提示客端户密码错误,如果密码正确,则提示客户端登录成功。
-如果用户名不存在,则使用接收到的用户名和密码注册一个账号,注册成功则提示客户端注册成功。注册失败则提示客户端注册失败。
二、代码
1.客户端
class Client1 {
public static void main(String[] args) throws IOException {
//创建客户端
Socket socket = new Socket("127.0.0.1", 10086); //127.0.0.1 是本机IP地址
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
//发送用户名和密码给服务器,登录
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名和密码");
String s = sc.next();
out.write(s.getBytes());
//读取是否登陆成功的反馈
byte[] bys = new byte[1024];
int len = in.read(bys);
String s1 = new String(bys, 0, len);
System.out.println(s1);
//如果不成功,收到注册的反馈,注册
if (s1.equals("账号不存在,请输入(账号-密码)注册")) {
System.out.println("请输入用户名和密码注册");
String s2 = sc.next();
out.write(s2.getBytes());
//读取反馈是否注册成功,并结束程序
len = in.read(bys);
String s3 = new String(bys, 0, len);
System.out.println(s3);
return;
}
//登陆成功,释放资源
in.close();
out.close();
socket.close();
}
}
2.服务器
class Server {
public static void main(String[] args) throws IOException {
//创建服务端
ServerSocket serverSocket = new ServerSocket(10086);
//创建线程池,限流
ExecutorService pool = Executors.newFixedThreadPool(5);
//每收到一个客户端连接的请求就开一个线程任务
while (true) {
Socket socket = serverSocket.accept();
System.out.println("用户:" + socket.getRemoteSocketAddress() + " 已连接服务器"); //输出连接的客户端的名称
Demo01 demo01 = new Demo01(socket);
pool.submit(demo01);
}
}
}
public class Demo01 implements Runnable {
private Socket socket;
public Demo01(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
//先读用户输入的用户名和密码
byte[] bys = new byte[1024];
int len = in.read(bys);
String s = new String(bys, 0, len);
String[] ss = s.split("-");
//再从文件中把存储的用户名与密码读出来
FileInputStream fis = new FileInputStream("day12/xxx/User_password.txt"); //本地文件,用来存用户数据
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
//遍历,判断用户名和密码是否正确
String line;
while ((line = br.readLine()) != null) { //遍历
String[] sl = line.split("-"); //拆分账号和密码
//判断是否存在该账号
if (sl[0].equals(ss[0])) {
if (sl[1].equals(ss[1])) {
out.write("登陆成功".getBytes());//账号存在,密码正确
br.close();
isr.close();
fis.close();
out.close();
in.close();
socket.close();
return;
} else { //账号存在,密码错误,
out.write("密码错误,登陆失败".getBytes());
br.close();
isr.close();
fis.close();
out.close();
in.close();
socket.close();
return;
}
}
}
/* 没有return,说明账号不存在,需要注册 */
out.write("账号不存在,请输入(账号-密码)注册".getBytes());
len = in.read(bys);
String s1 = new String(bys, 0, len);
//判断注册是否成功
if (s1.split("-")[0].equals(ss[0])) { //成功
//一次写一个字符串,把账号写进去
FileOutputStream fos = new FileOutputStream("day12/xxx/User_password.txt", true);
PrintWriter pw = new PrintWriter(fos);
pw.println(s1);
//提示注册成功
out.write("注册成功,请登录".getBytes());
br.close();
isr.close();
fis.close();
out.close();
pw.close();
fos.close();
in.close();
socket.close();
} else {
out.write("注册失败".getBytes());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}