Java業務邏輯結合MySQL實現登入註冊(XMPP協議的運用)
XMPP協議:
通訊協議是一種約定的規則,XMPP也無外乎是一種介面規則。簡單的說XMPP協議是一種標記格式的文字串。
舉例:
<msg><send>hxjava</send><content>helloworld</content></msg>
學習了XMPP協議之後,就實現C/S的登入註冊操作,這一次的登入操作就不像以前那樣用一些Map容器儲存資料了。
儲存資料要用資料庫,這樣不僅便於資料管理維護,而且資料不容易丟失,建立Map容器儲存的話,程式關閉資料就消失了。
我自己編寫C/S登入程式應用的到XMPP協議是:
<msg>
<name></name>
<psw></psw>
<tel></tel>
<email></email>
</msg>
因為僅僅是做練習,所以編寫的程式碼就比較的簡陋,資料庫儲存的資訊只有5個,使用者資訊:
id,name,password,tellphone,email
建立表格:
我用的是16.5版本的powerDesigner
建立表格之後,以sql的語言格式匯出,然後再用Navicat for MySQL軟體執行SQL語言,然後就得到了一個空表。
寫java的程式過程不多說,等下直接把程式碼發出來再做解釋。
先看過程
介面與程式碼測試:
註冊介面,當我填完註冊資訊按下注冊按鈕的時候,連線上伺服器,然後傳送一個XMPP協議的字串給伺服器,伺服器解析,然後新增到資料庫,EOF異常是關閉了連線的原因。
註冊了之後表裡有兩個賬號了,測試登入系統:
輸入一個正確的賬號密碼:
輸入第二個正確的賬號密碼:
第三次輸入一個錯誤的使用者名稱和密碼:
登入註冊系統的總結:
這個專案的測試完成了,基本功能已經全部實現了,體現了XMPP協議的約定與解析,實現了dao層與Java業務邏輯的結合,用資料庫裡面的資料來驗證使用者,使程式更可靠,維護性更強。
程式碼:
伺服器核心的程式碼是socket的連線與服務,之間有XMPP協議要解析,因為只是要測試註冊於登入功能,所以我就不建立太多的類去封裝了,驗證登入和註冊新增的程式碼只是封裝在方法中去,自定義一個客戶端執行緒類SocketThread,其中的run方法用死迴圈來執行登入或者註冊方法:
run方法
public void run() {
try{
String Msg = null;
while(true){
Msg = ois.readUTF();
String type = this.getType(Msg, "type");
if("createUser".equals(type)){
this.CreatUser(Msg);
}else if("loginUser".equals(type)){
this.LoginUser(Msg);
}
Msg = null;
}
}catch(Exception e){
e.printStackTrace();
}
}
解析XMPP的方法:
public String getType(String str,String type){//處理字串
System.out.println("已經進入了getType方法,獲取的Msg為: "+str);
int beginIndex = str.indexOf("<"+type+">");
int endIndex = str.indexOf("</"+type+">");
String value = str.substring(beginIndex+2+type.length(), endIndex);
System.out.println("獲取的value是: "+value);
return value;
}
註冊新使用者的方法:
public void CreatUser(String Msg){
System.out.println("伺服器已經進入了CreatUser方法...");
String name = this.getType(Msg, "name");
String password = this.getType(Msg, "psw");
String tellphone = this.getType(Msg, "tel");
String email = this.getType(Msg, "email");
System.out.println(name+" "+password+" "+tellphone+" "+email);
UserDatapojo udp = new UserDatapojo(2,name,password,tellphone,email);
try {
new UserDatadaoimpl().insert(udp);
System.out.println("資料已經存進資料庫...");
oos.writeUTF("使用者註冊成功...");
oos.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
登入的方法:
public void LoginUser(String Msg)throws Exception{
String name = this.getType(Msg, "name");
String password = this.getType(Msg, "psw");
boolean s = new UserDatadaoimpl().query(name,password);
if(s){
System.out.println("登入成功...");
oos.writeUTF("登入成功...");
oos.flush();
return ;
}
System.out.println("登入失敗...");
oos.writeUTF("登入失敗...");
oos.flush();
}
客戶端的註冊方法:
public void actionPerformed(ActionEvent e) {
if("註冊".equals(e.getActionCommand())){
String type = "<type>createUser</type>";
String name = "<name>"+nameField.getText()+"</name>";
String psw = "<psw>"+pswField.getText()+"</psw>";
String tel = "<tel>"+telField.getText()+"</tel>";
String email = "<email>"+mailField.getText()+"</email>";
String CreatUserMsg = "<msg>"+type+name+psw+tel+email+"</msg>";
System.out.println(CreatUserMsg);
Client socket = Client.getInstance();
socket.getConnection();
System.out.println("客戶端已連線上伺服器...");
try {
socket.getOos().writeUTF(CreatUserMsg);
socket.getOos().flush();
System.out.println("已傳送XMPP協議給伺服器...");
System.out.println(socket.getOis().readUTF());;
socket.closeConnection();
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println("執行了註冊功能..");
}
}
客戶端的登入方法:
if("登入".equals(e.getActionCommand())){
String type = "<type>loginUser</type>";
String name = "<name>"+userField.getText()+"</name>";
String psw = "<psw>"+pswField.getText()+"</psw>";
String CreatUserMsg = "<msg>"+type+name+psw+"</msg>";
System.out.println(CreatUserMsg);
Client socket = Client.getInstance();
socket.getConnection();
System.out.println("客戶端已連線上伺服器...");
try {
socket.getOos().writeUTF(CreatUserMsg);
socket.getOos().flush();
System.out.println("已傳送XMPP協議給伺服器...");
System.out.println(socket.getOis().readUTF());;
socket.closeConnection();
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println("執行了登入功能..");
}