这两天项目卡着不动了,来来回回删改了几趟,最终决定取消使用泛型传输对象,将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:n):例如,班长管理很多学生,班长也是学生
- 多对多(n:m):例如,一门课的课代表管理很多学生,每个学生可以被多个课代表管理。课代表也是学生。
最终版的ER图长成这样了:(挺难看的)