模拟TCP协议下用户登录的小案例

该博客介绍了一个模拟TCP协议用户登录的案例。客户端通过键盘输入用户名和密码发送到服务器,服务器验证用户信息,如果存在则判断密码,正确则登录成功,否则提示注册。若用户名不存在,服务器提示注册,客户端再次发送信息完成注册。整个过程涉及TCP连接、数据传输及文件读写操作。
摘要由CSDN通过智能技术生成

 


前言

这是一个模拟TCP协议下用户登录的小案例。

一、需求

  1. 服务端可以接收多个用户的请求连接。

  2. 客户端登录发送用户名和密码,格式:jack-123456,用户名和密码通过键盘录入。

  3. 服务器端接收到用户名和密码之后,查询本地用来存储注册信息的文件

    -判断用户名是否存在,如果用户名存在,则判断密码是否正确,如果密码不正确,则提示客端户密码错误,如果密码正确,则提示客户端登录成功。

        -如果用户名不存在,则使用接收到的用户名和密码注册一个账号,注册成功则提示客户端注册成功。注册失败则提示客户端注册失败。

二、代码

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();
        }
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值