標籤:
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("執行了登入功能..");}
想更多瞭解XMPP協議請看:
XMPP的ppt
Java商務邏輯結合MySQL實現登入註冊(XMPP協議的運用)