簡化版 QQ

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...()方法之類的

//你想轉換 首先得擁有一個 GoogleGson

```

/*

* 封裝所有公共操作 包括 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對象 然後成爲文件代碼

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章