Java学习记录(9)

文章描述了一个Java项目中遇到的问题及解决方案,通过取消泛型传输对象,合并Register和Login类为User类,利用Message类指示服务器执行相应操作(如注册、登录)。同时,展示了服务器端如何接收和处理这些消息,以及计划使用JDBC连接数据库。此外,还提及了ER图在设计数据库结构中的应用。
摘要由CSDN通过智能技术生成

  这两天项目卡着不动了,来来回回删改了几趟,最终决定取消使用泛型传输对象,将Register类与Login类合在一起变为了用户类,再通过Message类传输进服务器判断该进行什么方法去实现,比如传一个MessageType的Register类,服务器就会调用注册的功能。

  不过首先一点是这个common包在服务端和客户端都必须得有

 为了方便将注册信息与登录信息整合在了一起,不过后续有没有麻烦那就不知道了,要等写过才知道。

package common;

import java.io.Serializable;

public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    private String UserID;//用户ID
    private String UserPsd;//用户密码
    private String Email;
    private String Psd;
    private String Captcha;
    private String Id;
    private String Psd2;

    public User(String userID, String userPsd, String email, String psd, String captcha) {
        UserID = userID;
        UserPsd = userPsd;
        Email = email;
        Psd = psd;
        Captcha = captcha;
    }

    public User() {}

    public String getUserID() {
        return UserID;
    }

    public String getEmail() {
        return Email;
    }

    public void setEmail(String email) {
        Email = email;
    }

    public String getPsd() {
        return Psd;
    }

    public void setPsd(String psd) {
        Psd = psd;
    }

    public String getCaptcha() {
        return Captcha;
    }

    public void setCaptcha(String captcha) {
        Captcha = captcha;
    }


    public void setUserID(String userID) {
        UserID = userID;
    }

    public String getUserPsd() {
        return UserPsd;
    }

    public void setUserPsd(String userPsd) {
        UserPsd = userPsd;
    }
}

在Controller类中有不同的调用方法:


    public boolean CheckLogin(){//检查是否登录成功
        return new ClientServer().checkUser(IdNum,Psd);
    }

    public void CheckRegister(){//将注册信息传入服务器
        new ClientServer().CheckRegister(Email,Psd);
    }

这里跳转到ClientServer类中:

 这个是设置注册的,先传递一个Message对象进去告诉服务器我要准备注册了,服务器再调用注册方法来接受接下来要传入的对象。

public void CheckRegister(String Email,String Psd){//这里是注册验证
        Message CheckMes = new Message();
        CheckMes.setMsgType(MessageType.MESSAGE_REGISTER_APPLY);//这里设置的是发送消息

        User rdUser = new User();
        rdUser.setEmail(Email);
        rdUser.setPsd(Psd);//这里设置的是注册信息
        try {
            Connect();
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(CheckMes);

            ObjectOutputStream oosMes = new ObjectOutputStream(socket.getOutputStream());
            oosMes.writeObject(rdUser);//这里写入密码与邮箱信息

            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            Object o = ois.readObject();
            User UserData = (User) o;//这里读入一个验证码

            Captcha = UserData.getCaptcha();
            System.out.println("得到的验证码为 " + Captcha);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

服务器这边一直有个端口在监听:

 public ClientConnect(){
        try{
            socketServer = new ServerSocket(4396);

            while(true){//一直监听该端口
                System.out.println("端口等待连接");
                socket = socketServer.accept();
                System.out.println("端口已连接");

                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                Object o = ois.readObject();
                Message ChooseMes = (Message) o;

                if(ChooseMes.getMsgType().equals(MessageType.MESSAGE_REGISTER_APPLY)){
                    //这里写注册功能
                    RegisterFuc();
                    System.out.println("进入注册页面");
                }
                if(ChooseMes.getMsgType().equals(MessageType.MESSAGE_APPLY_LOGIN)){
                    CheckLogin();
                }
            }
        }catch (Exception e){
                e.printStackTrace();
            }
        }

然后根据得到的Message对象不同从而进入不同的方法中,例如注册方法;

    String str;
    public void RegisterFuc(){//传入注册信息
        try {
            System.out.println("准备进行注册");
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            Object o = ois.readObject();
            User UserData = (User) o;
            //这里读入邮箱信息通过send发送一封邮件
            System.out.println("得到的邮箱账号为: " + UserData.getEmail());
            System.out.println("读入注册信息");
            SendEmail(UserData.getEmail());
            System.out.println("验证码已发送");

            UserData.setCaptcha(str);//设置验证码返回
            SnowFlakeUtil SnowID = new SnowFlakeUtil();
            SnowID.getSnowFlakeId();


//            UserData.setUserID();这里用雪花算法生成一个ID一并返回
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(UserData);


        } catch (Exception e) {
            e.printStackTrace();
        }

    }

类似的还有登录方法:

 public void CheckLogin(){
        try {
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            System.out.println("读入流对象创建成功");
            User user;
            user = (User) ois.readObject();
            System.out.println("对象读入成功");

            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            Message message = new Message();
            //接下来从数据库读取数据并验证
            if(user.getUserID().equals("1572121126") && user.getUserPsd().equals("Tan.040506"))
            {
                System.out.println("账号密码验证成功");
                message.setMsgType(MessageType.MESSAGE_LOGIN_SUCCESS);
                oos.writeObject(message);

                ServerConnectClientThread scct = new ServerConnectClientThread(socket, user.getUserID());
                scct.start();
                new ManageClientThread().ThreadAdd(user.getUserID(),scct);
            }else{
                System.out.println("验证失败");
                message.setMsgType(MessageType.MESSAGE_LOGIN_FAILED);
                oos.writeObject(message);

                socket.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

然后就是JDBC连接数据库了,本来想直接写代码连,却发现不知道该如何设置数据库,于是乎做了一张ER图,改了四版还是五版来着,而且ER图不是流程图(我第一版就是流程图)。

ER 图

(1).实体型用矩形表示,框内写明实体名

(2).属性名用椭圆形表示,框内写明属性

(3).联系用菱形表示,框内写明联系名,并在无向边标明类(1,N,M)

实体间的联系

(1)、一对一联系(1:1)例如:一个班级只有一个班主任,一个班主任管理一个班级

(2)、一对多联系(1:n)例如:一个班级有很多学生,每个学生都属于这个班级

(3)、多对多联系(n:m)例如:一门课有很多学生听,每个学生要听很多门课。

两个以上的实体型之间的联系

(1)、一对多(1:n:m):课程,教师,参考书,一门课可以有很多老师讲授,但一个老师只能讲授一门课;一门课程只能使用若干本参考书,但每本参考书只供一门课使用。

(2)、多对多(n:m:p):供应商,项目,零件。一个供应商可以供给多个项目,每个项目可以用多个供应商;一个供应商可以供应多个零件,一个零件可以有多个供应商供应。

单个实体型间的关系

  1. 一对多(1:n):例如,班长管理很多学生,班长也是学生
  2. 多对多(n:m):例如,一门课的课代表管理很多学生,每个学生可以被多个课代表管理。课代表也是学生。

最终版的ER图长成这样了:(挺难看的)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值