反射在注册登录案例中的应用

来源:互联网 发布:算法工程师培训班 编辑:程序博客网 时间:2024/05/17 23:55

//业务需求:注册登录案例中需要构建客户端和服务端,实现注册账号、密码并进行登录的要求,下面简述该案例的逻辑代码。
1.首先是客户端

import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.Socket;import java.util.Scanner;public class Client {    public static void main(String[] args) throws Exception {        // 1.让用户选择操作步骤        Scanner sc = new Scanner(System.in);        while(true){            System.out.println("请输入你的请求,1代表注册,2代表登录,3代表退出");            String flag = sc.nextLine();            if("3".equals(flag)){                System.out.println("不想玩了!");                break;            }            switch (flag) {            case "1":                registerAndLogin(sc, "1");                break;            case "2":                registerAndLogin(sc, "2");                break;            default:                System.out.println("输入有误,请检查后再试");                break;            }        }       }    private static void registerAndLogin(Scanner sc, String flag) throws Exception {        // 1.创建和服务端通信的客户端Socket对象        Socket s = new Socket("192.168.6.48", 8888);        // 2.向服务端发送请求的数据        // 发送请求的方法        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));        if(flag.equals("1")){            bw.write("dealRegister");        }        else if(flag.equals("2")){            bw.write("dealLogin");        }        bw.newLine();        bw.flush();        // 向服务器发送账号和密码        System.out.println("请输入丫的账号:");        String userName = sc.nextLine();        bw.write(userName);        bw.newLine();        bw.flush();        System.out.println("请输入丫的密码:");        String pwd = sc.nextLine();        bw.write(pwd);        bw.newLine();        bw.flush();        //从服务端获取返回结果        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));        System.out.println(br.readLine());        //一次请求完毕之后,要关闭资源        s.close();    }}

2. 服务端

import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class Sever {    public static void main(String[] args) throws Exception {        // 1.创建服务端的ServerSocket并监听指定的端口        ServerSocket ss = new ServerSocket(8888);        // 循环接受客户端的请求        while (true) {            Socket s = ss.accept();            //使用线程来处理后续的操作            new Thread(new DealRunnable(s)).start();        }    }}class DealClass {    private String dealRegister(String userName, String pwd) {        // 将账号和密码保存到本地文件中        BufferedWriter bw = null;        try {            bw = new BufferedWriter(new FileWriter("D:/test.txt"));            bw.write(userName);            bw.newLine();            bw.flush();            bw.write(pwd);            bw.newLine();            bw.flush();        } catch (IOException e) {            e.printStackTrace();            return "系统异常,请重试";        } finally {            if (bw != null) {                try {                    bw.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return "注册成功";    }    private String dealLogin(String userName, String pwd) {        // 从本地文件中取出原始的账号和密码        BufferedReader br = null;        try {            br = new BufferedReader(new FileReader("D:/test.txt"));            String oldUserName = br.readLine();            String oldPwd = br.readLine();            if (oldUserName.equals(userName) && oldPwd.equals(pwd)) {                return "登录成功";            }        } catch (Exception e) {            e.printStackTrace();            return "系统异常";        } finally {            if (br != null) {                try {                    br.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return "登录失败,账号或密码错误";    }}

3. 服务端DealRunnable类

import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.lang.reflect.Method;import java.net.Socket;public class DealRunnable implements Runnable {    private Socket s;    public DealRunnable(Socket s){        this.s = s;    }    @Override    public void run() {        try {            // 从连接通道里面拿东西出来,请求的方法名,账号和密码            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));            // 取出请求的方法名            String methodName = br.readLine();            // 取出账号和密码            String userName = br.readLine();            String pwd = br.readLine();            // 用反射的方式动态使用方法            DealClass dealClass = new DealClass();            Class clazz = dealClass.getClass();            Method method = clazz.getDeclaredMethod(methodName, String.class, String.class);            method.setAccessible(true);// 暴力反射            String result = (String) method.invoke(dealClass, userName, pwd);            System.out.println(result);             // 将结果返回给客户端            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));            bw.write(result);            bw.newLine();            bw.flush();        } catch (Exception e) {            e.printStackTrace();        }    }}
0 0
原创粉丝点击