a) 客戶端登陸流程
i. 輸入用戶名密碼
ii. 建立連接
iii. 發送操作類型(登陸操作:login,註冊操作:regist)
iv. 發送用戶名密碼
v. 讀取驗證結果
vi. 根據結果判斷:如果成功就進入聊天界面,如果失敗就斷開連接,繼續登陸
vii. 前提登陸成功:讀取消息和發送消息並行流程
1. 讀取消息流程:從服務器讀取一條完成的消息,並把消息追加到顯示板上
2. 發送消息流程:輸入消息內容到聊天板,把消息獲取併發送給服務器
b) 客戶端註冊流程
i. 輸入註冊信息
ii. 建立連接
iii. 發送操作類型(登陸操作:login,註冊操作:regist)
iv. 發送註冊信息
v. 讀取驗證結果
vi. 斷開連接
vii. 如果結果是成功的:跳轉到登陸界面
如果結果是失敗的:依然停留在註冊界面
c) 服務端流程處理
i. 啓動服務器
ii. 等待客戶端連接
iii. 客戶端連接成功
iv. 有兩個分支:一個分支繼續等待客戶端連接,一個分支開始讀取消息
v. 讀取操作類型
vi. 操作類型如果是註冊
1. 讀取註冊信息
2. 校驗信息是否存在
3. 如果註冊信息存在,反饋客戶端註冊失敗消息(結束)
4. 如果註冊信息不存在,錄入註冊信息
5. 發送註冊結果(結束)
vii. 操作類型如果是登陸
1. 讀取登陸信息
2. 校驗登陸信息
3. 如果登陸失敗,發送登陸失敗結果(結束)
4. 如果登陸成功,發送登陸成功結果
5. 讀取消息
6. 轉發消息
7. 循環第5、6個步驟
package com.huaxin.database;
import java.io.Serializable;
//實現Serializable接口,便於使用對象流
public class UserInfo implements Serializable{
private String userName;
private String password;
//構造函數
public UserInfo(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.huaxin.database;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.JOptionPane;
public class Database {
public static HashMap<String,UserInfo> map = new HashMap<String,UserInfo>();
//調試代碼
// static{
// //構造文件輸出流
// FileOutputStream fos;
// try {
// fos = new FileOutputStream("database");
// //構造對象輸出流
// ObjectOutputStream oos = new ObjectOutputStream(fos);
// oos.writeObject(map);
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
public static void main(String[] args) {
// 調試代碼
// Database.readDataBase();
// Database.add("user3", new UserInfo("user3","pwd3"));
// Database.readDataBase();
// Database.add("user1", new UserInfo("user1","pwd"));
// Database.add("user2", new UserInfo("user2","pwd"));
// Database.add("user3", new UserInfo("user3","pwd"));
// Iterator it =map.entrySet().iterator();
// while(it.hasNext()){
// Map.Entry<String,UserInfo> entry=(Map.Entry<String,UserInfo>)it.next();
// String key=(String)entry.getKey();
// UserInfo usin=(UserInfo)entry.getValue();
// System.out.println(usin.getUserName()+":"+usin.getPassword());
// }
}
static {
readDataBase();
UserInfo userSuper =new UserInfo("zhou","zhou");
map.put(userSuper.getUserName(),userSuper);
updateDataBase();
// System.out.println("已經添加初始數據!");
}
//數據庫的增刪查改函數
//增加用戶
public static void add(String name,UserInfo userInfo) {
//保證讀入都是最新的數據
readDataBase();
// System.out.println(name);
// System.out.println(map.get(name));
if(map.get(name)!=null){
JOptionPane.showMessageDialog(null, "該用戶已存在!");
}else{
map.put(name, userInfo);
// 調試代碼
// Iterator it =map.entrySet().iterator();
// while(it.hasNext()){
// Map.Entry<String,UserInfo> entry=(Map.Entry<String,UserInfo>)it.next();
// String key=(String)entry.getKey();
// UserInfo usin=(UserInfo)entry.getValue();
// System.out.println(usin.getUserName()+":"+usin.getPassword());
// }
// System.out.println("已經添加!");
updateDataBase();
}
}
//刪除用戶
public static void delete(String name) {
//保證讀入都是最新的數據
readDataBase();
if(map.get(name)!=null){
map.remove(name);
updateDataBase();
}else{
JOptionPane.showMessageDialog(null, "該用戶不存在!");
}
}
//查找用戶
public static UserInfo get(String name) {
readDataBase();
if(map.get(name)!=null){
return map.get(name);
}else{
JOptionPane.showMessageDialog(null, "該用戶不存在!");
return null;
}
}
//修改用戶
public static void update(String name,UserInfo userInfo) {
//保證讀入都是最新的數據
readDataBase();
if(map.get(name)!=null){
map.put(name, userInfo);
updateDataBase();
}else{
JOptionPane.showMessageDialog(null, "該用戶不存在!");
}
}
//利用文件將用戶信息永久的保存起來
public static HashMap<String,UserInfo> readDataBase() {
try {
//構造文件輸入流
FileInputStream fis = new FileInputStream("database");
//構造對象輸入流
ObjectInputStream ois = new ObjectInputStream(fis);
//將文數據庫中信息讀入進來
Object obj=ois.readObject();
HashMap<String,UserInfo> hm=(HashMap<String,UserInfo>)obj;
//將讀入進來的數據賦給map
map=hm;
// Iterator it =hm.entrySet().iterator();
// while(it.hasNext()){
// Map.Entry<String,UserInfo> entry=(Map.Entry<String,UserInfo>)it.next();
// String key=(String)entry.getKey();
// UserInfo usin=(UserInfo)entry.getValue();
// System.out.println(usin.getUserName()+":"+usin.getPassword());
// }
// System.out.println("yijing duru wenjian 。。。。。。");
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
public static void updateDataBase() {
try {
//構造文件輸出流
FileOutputStream fos = new FileOutputStream("database");
//構造對象輸出流
ObjectOutputStream oos = new ObjectOutputStream(fos);
//將當前數據寫出到文件
// Iterator it =map.entrySet().iterator();
//
// while(it.hasNext()){
// Map.Entry<String,UserInfo> entry=(Map.Entry<String,UserInfo>)it.next();
// String key=(String)entry.getKey();
// UserInfo usin=(UserInfo)entry.getValue();
// System.out.println(usin.getUserName()+":"+usin.getPassword());
// }
oos.writeObject(map);
// System.out.println("已經更新數據庫.....");
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
由於整個工程過於龐大,所以就不把所有的源代碼全部貼出來了;想要學習交流的小夥伴們,請在下面找鏈接下載整個項目的源代碼;重在思路的理解;