利用Socket实现登录小demo

这个示例展示了如何使用Java的Socket类创建一个简单的客户端和服务器端应用程序进行登录验证。客户端发送用户名和密码对象到服务器,服务器检查凭证并返回响应。如果登录失败,客户端会在达到最大尝试次数之前重复尝试登录。

客户端代码

package com.lsc.test01;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * @author lishengchen
 * @version 1.0
 * @Date 2020/11/24
 */
public class TestClient {
    public static void main(String[] args) throws IOException {
       int count = 0;
        Scanner sc = new Scanner(System.in);
        login(sc, count);
    }

    private static void login(Scanner sc, int count) throws IOException {
        Socket s = null;
        ObjectOutputStream oos = null;
        try {
            System.out.println("请输入用户名!");
            String name = sc.next();
            System.out.println("请输入用户名!");
            String pwd = sc.next();
            User user = new User(name, pwd);
            s = new Socket("localhost",8888);
            //DataOutputStream dos = new DataOutputStream(s.getOutputStream());
            //将键盘录入的信息通过ObjectOutputStream发送到socket服务端
            oos = new ObjectOutputStream(s.getOutputStream());
            oos.writeObject(user);
            //从服务端接受到返回的信息
            DataInputStream dis = new DataInputStream(s.getInputStream());
            String response = dis.readUTF();
            System.out.println(response);
            count++;
            if(count < 3){
                if(response != null && response.startsWith("对不起")){
                    login(sc, count);
                }
            }else{
                System.out.println("对不起,登录次数超过3次!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            oos.close();
            s.close();
        }
    }
}

服务端代码

package com.lsc.test01;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author lishengchen
 * @version 1.0
 * @Date 2020/11/24
 */
public class TestServer {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        int count = 0;
        try {
            //socket服务端
            ServerSocket ss = new ServerSocket(8888);
            Socket socket = null;
            while (true) {
                socket = ss.accept();
                //通过构造方法将socket信息传入一个新的线程中执行
                new SocketThread(socket).start();
                count++;
                System.out.println("当前尝试登录的第"+count+"个用户,该用户的IP为:" + socket.getInetAddress());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

线程类代码

package com.lsc.test01;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;

/**
 * @author lishengchen
 * @version 1.0
 * @Date 2020/11/24
 */
public class SocketThread extends Thread {
    ObjectInputStream ois = null;
    DataOutputStream dos = null;
    Socket socket = null;
    SocketThread st = null;
    //构造方法
    public SocketThread(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //通过输入将客户端发过的对象信息解析出来
            ois = new ObjectInputStream(socket.getInputStream());
            User user = (User)ois.readObject();
            String name = user.getName();
            String pwd = user.getPwd();
            //判断账号密码,将登录结果反馈给客户端
            dos = new DataOutputStream(socket.getOutputStream());
            if("lsc".equals(name) && "123456".equals(pwd)){
                dos.writeUTF("恭喜,登录成功!");
            }else{
                dos.writeUTF("对不起,账号或者密码不正确!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

User对象

package com.lsc.test01;

import java.io.Serializable;

/**
 * @author lishengchen
 * @version 1.0
 * @Date 2020/11/24
 */
public class User implements Serializable {
    private static final long serialVersionUID = 5325554995318095216L;
    private String name;
    private String pwd;

    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值