基于Java實(shí)現(xiàn)互聯(lián)網(wǎng)實(shí)時(shí)聊天系統(tǒng)(附源碼)
0. 前言
決定以Netty為核心,以WebSocket為應(yīng)用層通信協(xié)議做一個(gè)互聯(lián)網(wǎng)聊天系統(tǒng),整體而言就像微信網(wǎng)頁版一樣,但考慮到這個(gè)聊天系統(tǒng)的功能非常多,因此只打算實(shí)現(xiàn)核心的聊天功能,包括單發(fā)、群發(fā)、文件發(fā)送,然后把項(xiàng)目與Spring整合做成開源、可拓展的方式,給大家參考、討論、使用,歡迎大家的指點(diǎn)。
關(guān)于Netty
Netty 是一個(gè)利用 Java 的高級網(wǎng)絡(luò)的能力,隱藏其背后的復(fù)雜性而提供一個(gè)易于使用的 API 的客戶端/服務(wù)器框架。
關(guān)于WebSocket通信協(xié)議
WebSocket是為了解決HTTP協(xié)議中通信只能由客戶端發(fā)起這個(gè)弊端而出現(xiàn)的,WebSocket基于HTTP5協(xié)議,借用HTTP進(jìn)行握手、升級,能夠做到輕量的、高效的、雙向的在客戶端和服務(wù)端之間傳輸文本數(shù)據(jù)。
1、技術(shù)準(zhǔn)備
IDE:MyEclipse 2016
JDK版本:1.8.0_121
瀏覽器:谷歌瀏覽器、360瀏覽器(極速模式)(涉及網(wǎng)頁前端設(shè)計(jì),后端開發(fā)表示很苦悶)
涉及技術(shù):
- Netty 4
- WebSocket + HTTP
- Spring MVC + Spring
- JQuery
- Bootstrap 3 + Bootstrap-fileinput
- Maven 3.5
- Tomcat 8.0
2. 整體說明
2.1 設(shè)計(jì)思想
整個(gè)通信系統(tǒng)以Tomcat作為核心服務(wù)器運(yùn)行,其下另開一個(gè)線程運(yùn)行Netty WebSocket服務(wù)器,Tomcat服務(wù)器主要處理客戶登錄、個(gè)人信息管理等的HTTP類型請求(通常的業(yè)務(wù)類型),端口為8080,Netty WebSockt服務(wù)器主要處理用戶消息通信的WebSocket類型請求,端口為3333。用戶通過瀏覽器登錄后,瀏覽器會維持一個(gè)Session對象(有效時(shí)間30分鐘)來保持登錄狀態(tài),Tomcat服務(wù)器會返回用戶的個(gè)人信息,同時(shí)記錄在線用戶,根據(jù)用戶id建立一條WebSocket連接并保存在后端以便進(jìn)行實(shí)時(shí)通信。當(dāng)一個(gè)用戶向另一用戶發(fā)起通信,服務(wù)器會根據(jù)消息內(nèi)容中的對話方用戶id,找到保存的WebSocket連接,通過該連接發(fā)送消息,對方就能夠收到即時(shí)收到消息。當(dāng)用戶注銷或退出時(shí),釋放WebSocket連接,清空Session對象中的登錄狀態(tài)。(插播一條廣告:需要開通正版IDEA的可以聯(lián)系我,56元一年,正版授權(quán)激活,官網(wǎng)可查有效期,有需要的加我微信:poxiaozhiai6,備注:914。)
事實(shí)上Netty也可以用作一個(gè)HTTP服務(wù)器,而這里使用Spring MVC處理HTTP請求是出于熟悉的緣故,也比較接近傳統(tǒng)開發(fā)的方式。
2.2 系統(tǒng)結(jié)構(gòu)
系統(tǒng)采用B/S(Browser/Server),即瀏覽器/服務(wù)器的結(jié)構(gòu),主要事務(wù)邏輯在服務(wù)器端(Server)實(shí)現(xiàn)。借鑒MVC模式的思想,從上至下具體又分為視圖層(View)、控制層(Controller)、業(yè)務(wù)層(Service)、模型層(Model)、數(shù)據(jù)訪問層(Data Access)
2.3 項(xiàng)目結(jié)構(gòu)
項(xiàng)目后端結(jié)構(gòu):
項(xiàng)目前端結(jié)構(gòu):
2.4 系統(tǒng)功能模塊
系統(tǒng)只包括兩個(gè)模塊:登錄模塊和聊天管理模塊。
- 登錄模塊:既然作為一個(gè)系統(tǒng),那么登錄的角色認(rèn)證是必不可少的,這里使用簡單、傳統(tǒng)的Session方式維持登錄狀態(tài),當(dāng)然也有對應(yīng)的注銷功能,但這里的注銷除了清空Session對象,還要釋放WebSocket連接,否則造成內(nèi)存泄露。
- 聊天管理模塊:系統(tǒng)的核心模塊,這部分主要使用Netty框架實(shí)現(xiàn),功能包括信息、文件的單條和多條發(fā)送,也支持表情發(fā)送。
- 其他模塊:如好友管理模塊、聊天記錄管理、注冊模塊等,我并沒有實(shí)現(xiàn),有興趣的話可以自行實(shí)現(xiàn),與傳統(tǒng)的開發(fā)方式類似。
由于本系統(tǒng)涉及多個(gè)用戶狀態(tài),有必要進(jìn)行說明,下面給出本系統(tǒng)的用戶狀態(tài)轉(zhuǎn)換圖。
2.5 系統(tǒng)界面
系統(tǒng)聊天界面如下:
3. 核心編碼
這里只說明需要注意的地方,詳細(xì)的請看源碼
3.1 Netty服務(wù)器啟動與關(guān)閉
當(dāng)關(guān)閉Tomcat服務(wù)器時(shí),也要釋放Netty相關(guān)資源,否則會造成內(nèi)存泄漏,關(guān)閉方法如下面的close(),如果只是使用shutdownGracefully()方法的話,關(guān)閉時(shí)會報(bào)內(nèi)存泄露Memory Leak異常(但I(xiàn)DE可能來不及輸出到控制臺)
/** * 描述: Netty WebSocket服務(wù)器 * 使用獨(dú)立的線程啟動 * @author Kanarien * @version 1.0 * @date 2018年5月18日 上午11:22:51 */ public class WebSocketServer implements Runnable{ /** * 描述:啟動Netty Websocket服務(wù)器 */ public void build() { // 略,詳細(xì)請看源碼 } /** * 描述:關(guān)閉Netty Websocket服務(wù)器,主要是釋放連接 * 連接包括:服務(wù)器連接serverChannel, * 客戶端TCP處理連接bossGroup, * 客戶端I/O操作連接workerGroup * * 若只使用 * bossGroupFuture = bossGroup.shutdownGracefully(); * workerGroupFuture = workerGroup.shutdownGracefully(); * 會造成內(nèi)存泄漏。 */ public void close(){ serverChannelFuture.channel().close(); Future<?> bossGroupFuture = bossGroup.shutdownGracefully(); Future<?> workerGroupFuture = workerGroup.shutdownGracefully(); try { bossGroupFuture.await(); workerGroupFuture.await(); } catch (InterruptedException ignore) { ignore.printStackTrace(); } } }
4. 效果及操作演示
4.1 登錄操作
登錄入口為:http://localhost:8080/WebSocket/login 或 http://localhost:8080/WebSocket/ 當(dāng)前系統(tǒng)用戶固定為9個(gè),群組1個(gè),包括9人用戶。
- 用戶1 用戶名:Member001 密碼:001
- 用戶2 用戶名:Member002 密碼:002
- ······
- 用戶9 用戶名:Member009 密碼:009
4.2 聊天演示
5. 源碼下載
下載鏈接: https://pan.baidu.com/s/1JuXRqWH0HFN0ruMm-BnysA
提取碼: e9ej
以上就是基于Java實(shí)現(xiàn)互聯(lián)網(wǎng)實(shí)時(shí)聊天系統(tǒng)(附源碼)的詳細(xì)內(nèi)容,更多關(guān)于Java實(shí)時(shí)聊天系統(tǒng)的資料請關(guān)注腳本之家其它相關(guān)文章!
- Java?NIO實(shí)現(xiàn)聊天系統(tǒng)
- Java Socket實(shí)現(xiàn)多人聊天系統(tǒng)
- 基于Java網(wǎng)絡(luò)編程和多線程的多對多聊天系統(tǒng)
- Java 網(wǎng)絡(luò)編程之 TCP 實(shí)現(xiàn)簡單的聊天系統(tǒng)
- Java網(wǎng)絡(luò)編程UDP實(shí)現(xiàn)多線程在線聊天
- Java網(wǎng)絡(luò)編程實(shí)例——簡單模擬在線聊天
- Java使用TCP實(shí)現(xiàn)在線聊天的示例代碼
- Java GUI編程實(shí)現(xiàn)在線聊天室
- Java中使用websocket實(shí)現(xiàn)在線聊天功能
- java實(shí)現(xiàn)在線聊天系統(tǒng)
相關(guān)文章
淺談java線程中生產(chǎn)者與消費(fèi)者的問題
下面小編就為大家?guī)硪黄獪\談java線程中生產(chǎn)者與消費(fèi)者的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07SpringBoot2.x 集成 Thymeleaf的詳細(xì)教程
本文主要對SpringBoot2.x集成Thymeleaf及其常用語法進(jìn)行簡單總結(jié),其中SpringBoot使用的2.4.5版本。對SpringBoot2.x 集成 Thymeleaf知識感興趣的朋友跟隨小編一起看看吧2021-07-07mybatis?plus?MetaObjectHandler?不生效的解決
今天使用mybatis-plus自動為更新和插入操作插入更新時(shí)間和插入時(shí)間,配置了MetaObjectHandler不生效,本文就來解決一下,具有一定的 參考價(jià)值,感興趣的可以了解一下2023-10-10IDEA之web項(xiàng)目導(dǎo)入jar包方式
這篇文章主要介紹了IDEA之web項(xiàng)目導(dǎo)入jar包方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05Spring注解驅(qū)動之ApplicationListener異步處理事件說明
這篇文章主要介紹了Spring注解驅(qū)動之ApplicationListener異步處理事件說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09Linux實(shí)時(shí)查看Java接口數(shù)據(jù)的案例方法
在Linux系統(tǒng)中實(shí)時(shí)查看Java接口數(shù)據(jù)通常涉幾個(gè)步驟,通過示例代碼說明如何使用Python的requests庫和Linux的cron作業(yè)來定期查詢Java應(yīng)用程序的接口并打印結(jié)果,感興趣的朋友跟隨小編一起看看吧2024-06-06如何用120行Java代碼寫一個(gè)自己的區(qū)塊鏈
這篇文章就是幫助你使用 Java 語言來實(shí)現(xiàn)一個(gè)簡單的區(qū)塊鏈,用不到 120 行代碼來揭示區(qū)塊鏈的原理,感興趣的就一起來了解一下2019-06-06springboot部署linux訪問服務(wù)器資源的方法
這篇文章主要介紹了springboot部署linux訪問服務(wù)器資源,部署springboot項(xiàng)目至服務(wù)器用了幾種不同方法,文中給大家詳細(xì)介紹,需要的朋友可以參考下2019-12-12解決Intellij IDEA運(yùn)行報(bào)Command line is too long的問題
這篇文章主要介紹了解決Intellij IDEA運(yùn)行報(bào)Command line is too long的問題,本文通過兩種方案給大家詳細(xì)介紹,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05