java实现聊天室界面javafx_java 聊天室WeChat
功能和特性
基于socket實(shí)現(xiàn)的c/s架構(gòu)的的通信
服務(wù)器和客戶心跳連接
gson實(shí)現(xiàn)的消息通信機(jī)制
注冊(cè)及登錄
支持私聊和群聊。
動(dòng)態(tài)更新用戶列表以及用戶消息提示
支持emoji表情,以及emoji表情選擇器
服務(wù)器端數(shù)據(jù)庫(kù)用戶記錄
實(shí)現(xiàn)文件傳輸
文件記錄
功能展示
login
chatroom
表情包
數(shù)據(jù)庫(kù)
整體架構(gòu)
使用了比較簡(jiǎn)單的worker-master架構(gòu)。
由masterserve進(jìn)行事件的分發(fā)
由workserver具體的管理單個(gè)用戶的消息請(qǐng)求
消息機(jī)制
采用json作為通信載體,后期功能性的更改較為簡(jiǎn)單
通信命令字設(shè)計(jì)如下
public final static boolean SINGLE = true;
public final static boolean GROUP = false;
/**
* status
*/
public final static int SUCCESS = 0x01;
public final static int FAILED = 0x02;
/**
* message
*/
public static Integer COMMAND = 0x10;
public static Integer TIME = 0x11;
public static Integer USERNAME = 0x12;
public static Integer PASSWORD = 0x13;
public static Integer SPEAKER = 0x14;
public static Integer RECEIVER = 0x15;
public static Integer CONTENT= 0x16;
/**
* command
*/
public final static int COM_LOGIN = 0x20;
public final static int COM_SIGNUP = 0x21;
public final static int COM_RESULT = 0x22;
public final static int COM_DESCRIPTION = 0x23;
public final static int COM_LOGOUT =0x24;
public final static int COM_CHATWITH = 0x25;
public final static int COM_GROUP = 0x26;
public final static int COM_CHATALL = 0x27;
public final static int COM_KEEP = 0x28;
public final static int COM_MESSAGEALL = 0X29;
基本響應(yīng)流程概述
Client->Server
請(qǐng)求注冊(cè)(已注冊(cè)用戶請(qǐng)求登錄),請(qǐng)求登錄狀態(tài)
聊天命令分為單人和多人群聊
Server->Client
返回登錄|注冊(cè)成功反饋
返回登錄|注冊(cè)失敗反饋,及失敗原因(用戶已經(jīng)注冊(cè)|用戶尚未注冊(cè)|密碼錯(cuò)誤|服務(wù)器連接失敗等...)
每個(gè)用戶登錄廣播用戶集
提取數(shù)據(jù)倉(cāng)發(fā)送消息給指定用戶
廣播信息
心跳連接
之前考慮上線下線方式的時(shí)候想到的一個(gè)辦法是,下線的時(shí)候給服務(wù)器發(fā)送下線通知,后面考慮了出現(xiàn)斷網(wǎng)等突發(fā)情況時(shí)這樣的設(shè)計(jì)將出現(xiàn)問題。所以采用了心跳連接的方式。
server端采用了以時(shí)間差為判斷方式的連接判斷方式,通過具體的實(shí)踐server端的實(shí)踐差為2000ms較為合適.
client維持了500ms的心跳
Server
啟動(dòng)環(huán)節(jié)
服務(wù)器前先查詢數(shù)據(jù)庫(kù),從中加載出用戶列表到內(nèi)存。
(注:這樣的方式在數(shù)據(jù)較大時(shí)不合適,應(yīng)該設(shè)計(jì)好數(shù)據(jù)庫(kù)的消息存儲(chǔ)機(jī)制,避免服務(wù)器端的數(shù)據(jù)量大時(shí)出現(xiàn)問題,這個(gè)小程序因?yàn)橹霸谠O(shè)計(jì)的時(shí)候本來沒有加上數(shù)據(jù)庫(kù)的打算,后期加入后,也不想再次重構(gòu)服務(wù)器端)
數(shù)據(jù)庫(kù)已經(jīng)封裝成Dao層,使用雙重鎖的單例模式進(jìn)行控制訪問
用戶信息存儲(chǔ)及轉(zhuǎn)發(fā)
用戶信息存儲(chǔ)倉(cāng)的設(shè)置
serverUser的實(shí)體bean在設(shè)計(jì)時(shí)采用的是 ConcurrentLinkedQueue作為信息存儲(chǔ)倉(cāng)的數(shù)據(jù)結(jié)構(gòu),保證在多線程下的安全。
每次server端讀取client端發(fā)送的comment將數(shù)據(jù)發(fā)送到對(duì)應(yīng)user的warehouse(數(shù)據(jù)倉(cāng))中,接著讀取其控制用戶的warehouse,執(zhí)行命令。
client
整體基本架構(gòu)為MVC
model層通過control進(jìn)行數(shù)據(jù)交互同時(shí)control層進(jìn)行l(wèi)ogin和chatroom界面切換控制。
基本界面切換
之前對(duì)javafx不熟悉,根據(jù)寫andorid經(jīng)驗(yàn),總覺得Javafx的界面切換不是很方便。初期將界面寫了出來,后期進(jìn)行了界面切換方式的修改。
參考JavaFX - 實(shí)現(xiàn)管理多個(gè)Stage窗口及源碼解析
一些值得注意的問題
gson的使用
gson 的好用不必多說,寫的時(shí)候發(fā)現(xiàn)一個(gè)小問題gson 在使用時(shí)會(huì)將Integer以及int都會(huì)轉(zhuǎn)為Double或者double類型
解決方案如下解決gson將Integer默認(rèn)轉(zhuǎn)換成Double的問題
javafx UI界面更新
類似于android在UI界面只能在UI線程中進(jìn)行更改,在javafx中也是如此。不過之前Android知道其異步方式的實(shí)現(xiàn)
在javafx中查閱資料后總結(jié)下其更改界面的方法
Platform.runLater(new Task() {
@Override
protected String call() throws Exception {
//do UI operato
return null;
}
});
文件路徑
在寫圖片的顯示時(shí)發(fā)現(xiàn)了顯示的問題,特地的查了這部分的材料,其中比較好的幾篇
Java中文件的相對(duì)路徑與絕對(duì)路徑
Java中文件路徑及其訪問
emoji表情的實(shí)現(xiàn)
方案1 傳統(tǒng)emoji的表情的實(shí)現(xiàn)
其實(shí)早在2010年,Unicode編碼就已經(jīng)納入了700多個(gè)Emoji表情,所以是可以支持表情的,只要加載支持Emoji表情的字庫(kù)即可 鏈接How to support Emojis (Part1)
但是emoji的顯示時(shí)要依賴于平臺(tái)的,之前在Android端寫過的emoji實(shí)現(xiàn)由于和ios端不統(tǒng)一也重新定制了一份
附上對(duì)比
Android
javafx
簡(jiǎn)直要丑哭了
實(shí)現(xiàn)方式
emoji 的編碼方式
java中String 采用 UTF-16 編碼方式存儲(chǔ)所有字符, getBytes(String charsetName)也就是轉(zhuǎn)為UTF-8 即可實(shí)現(xiàn)編碼轉(zhuǎn)換。將其輸出即可顯示emoji
方案2 之前在Android端通過對(duì)SpannableString 的處理實(shí)現(xiàn)添加任何的圖片到文本中
根據(jù)這個(gè)思路 參考EmojiOneJava實(shí)現(xiàn)了功能.
而且javafx的textArea不支持 文字加圖片, 在java分fx中textflow可以存放子組件,所以顯示界面使用textflow,輸入界面使用textArea,顯示的表情以表情簡(jiǎn)寫表示
總結(jié)
以上是生活随笔為你收集整理的java实现聊天室界面javafx_java 聊天室WeChat的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gta5游艇有什么用
- 下一篇: java掩码校验_Java 检查Ip掩码