GitHub: chat_room 項目代碼連接
準備工作:
1.數據源 : Druid 拽~ 阿里數據源 優點:1.降低資源消耗 2.提高響應速率 3.方便管理
1.加載數據源
2.獲取連接 Connection
3.執行SQL
4.關閉資源
通過繼承.有重複的封裝在BasedDao
查詢類SQL
select : executeQuery
PreparedStatement
ResultSet
更新類SQL
insert/update/delete
PreparedStatement
//頁面 Swing
//頁面
JPanel - 盤子 存放各類組件的基礎容器
JLabel - 標籤 圖片也是標籤
JTextField - 輸入框
JButton - 按鈕
JOptionPanel - 提示框(靜態方法)
JScrollPane 滾動條
farm.size(400,400); 要刪除 pork
//建立連接
使用套接字建立連接
ServerSocket 服務端
-accept(): 返回客戶端的Socket
Socket 客戶端
工具類抽取
加載資源文件使用 XXX.properties 文件 所以提取爲工具類,讀取資源文件
傳遞消息 使用 json字符串
- {"key":"value",...}
第三方工具 轉換 json序列化概念 str -> Object :json的反序列化 Object -> str :json的序列化
這和以前的序列化功不一樣 以前的 序列化是把 對象變爲流的形式 Object...()方法之類的
//你想轉換 首先得擁有一個 Google的Gson類
```
/*
* 封裝所有公共操作 包括 json 格式
* getResourceAsStream(fileName); 方法會讀取當前工程下的資源文件
*
* ctrl 加 shift 加 T 創建測試類
* */
public class CommUtil {
private static final Gson GSON = new GsonBuilder().create();
//通過properties的文件名 來獲取properties資源文件
public static Properties loadProperties(String fileName){
Properties properties = new Properties();
InputStream inputStream = CommUtil.class.getClassLoader().
getResourceAsStream(fileName);
try {
properties.load(inputStream);
} catch (IOException e) {
System.err.println("資源文件加載失敗");
e.printStackTrace();
return null;
}
return properties;
}
//首先要用Gson
//序列化
public static String object2String(Object object){
return GSON.toJson(object);
}
public static Object string2Object(String string, Class objClz){
return GSON.fromJson(string,objClz);
}
}
```
Message 類
//規定字段
type:1
content:userName
to:(私聊,羣聊)
1.註冊功能
//MD5加密
//註冊用戶: 在服務端實現,需要網絡
//註冊成功返回登陸界面, 連接斷掉 --> 簡化 現在放在客戶端
註冊成功提示註冊成功,隱藏註冊頁面,返回登陸頁面,
不成功,不隱藏當前頁面.
2.登陸功能
服務端
1.保存新用戶的上線信息 //最後左
2.將當前的所有用戶 發送給新用戶的好友列表
3.服務器給新用戶的所有好友 發送上線提醒
客戶端
1.與服務器建立連接, 將自己的用戶名與Socket保存到服務端緩存
2.讀取服務端的所有在線好友信息
3.既然要接收 , 那麼新建一個後臺線程不斷讀取服務端發送來的信息
////點擊登錄
1.發送驗證碼 驗證用戶名 密碼
-不成功 提示 繼續當前頁面
-成功 和服務器連接
? 但服務器怎麼知道是你 -你的qq號
//現在還是存在一個問題 我可以重複登錄 / 那麼想要解決這個問題 或許可以從 服務器端的Map集合入手
-比如說名字已經在服務器端的Map集合裏面了!!!! 那我就可以不去服務端查找 直接告訴你 你還想一號登兩次?
用戶私聊
客戶端:
私聊的發起者,主動發送發
1.點擊要私聊的用戶標籤,彈出私聊界面
2.在彈出的頁面,按照指定的協議向服務器發送私聊信息
-type : 2
-content : sender-msg
-to:目標客戶端的用戶名
//.不可能每次點擊都new一下私聊界面 所以存在緩存
信息的接收方:
1.判斷是私聊或者羣聊 , 判斷有沒有界面 沒有就new一個否則取出 彈出私聊界面 ..
2.按照指定協議讀取內容,發送信息
服務端:
1.收到客戶端發來的私聊信息,取出目標端的Socket, 做信息轉發
//羣聊
客戶頓
羣聊發起者
1.點擊羣名稱標籤,彈出羣聊界面
2.將羣聊內容發送到服務端
//type :4
//content : senderName - msg
//to : groupName
羣聊接受者
服務端
1.收到羣聊信息.解出羣名
2.根據羣名稱,找到該羣的所有用戶 然後根據clients 找到該用戶socket 然後發送信息
總結:
缺點
1.界面樣式太單一化 ---
2.功能較少 --- 比如文件傳輸等
3.註冊是在客戶端 --因爲模仿qq的話, 註冊是在服務端, html,jsp ..郵箱/電話號碼驗證頁面等
4.聊天記錄,羣聊記錄等沒有做持久化 退出即清空聊天記錄等
收穫
1.良好的命名規範 == 自己對自己的友好性
2.寫代碼前先想好大致思路 ,以及你需要什麼 --- 比如抽取工具類 代碼未動, 註釋先行
3.掌握幾個Swing編程的 類用法
4.必須對自己友好, 多借鑑已有的工具及技術棧
//關於文件傳輸
有一個控件 有JFrameChoose 選擇文件夾 返回一個file對象 然後成爲文件代碼