個人技術博客:netty構建聊天服務器
技術概述
Netty是由JBOSS提供的一個java開源框架。Netty提供異步的、事件驅動的網絡應用程序框架和工具,用以快速開發高性能、高可靠性的網絡服務器和客戶端程序dsf。我們的項目主要使用netty實現一個異步的聊天服務器,同時用於處理前端一些需要實時處理的用戶行為,如用戶的消息簽收,用戶的心跳維持,重新拉取好友等動作的實時傳遞,是一款易於使用的 API 的客戶端/服務器框架。
技術詳述
主要使用netty用於用戶的聊天相關的事件,下面我簡單介紹一下用netty構建的聊天服務器其中使用的相關技術。
先簡單展示一下使用netty構建的服務器其中我們拓展的字段並闡述大致功能。
聊天服務器的初始化
這部分主要提供聊天室初始化的一些handler,添加 ChannelHandler 到 ChannelPipeline,並且提供必要的注釋供拓展。
心跳支持
使用心跳檢測維持用戶的在線狀態,這其中包含讀空閑、寫空閑還有讀寫空閑的判斷。
聊天
因為聊天中私聊和群聊的實現和思路類似,其中群聊需要對用戶進行廣播,這里聊天就只取群聊來作例子展示。
首先,因為我們的項目中特別要求,對聊天室有時間的限制,所以我們開始聊天前需要使用一個字段判斷聊天室當前的狀態。
接下去,若聊天室處於正常開啟狀態,接下去開啟聊天的動作行為,下面展示一下聊天室handler的處理。
消息的簽收
這部分,因為考慮到用戶的離線狀態,無法對消息進行實時的簽收,所以我們對離線用戶的消息簽收在數據庫加了個簽收判斷字段,同時對用戶的狀態進行判斷並消息簽收。
下面,因為私聊和群聊類似,我這里只展示群聊的消息簽收。
其余部分字段的功能和實現類似,雖然現在我覺得用netty構建的服務器對用戶的登陸狀態進行判斷有點不合理,但是當時考慮的是后端實時對被封禁用戶和聊天室的狀態進行判斷並處理,所以在netty服務器中應用了如此多的字段進行判斷,不過之后我也學到了新知識,這部分判斷還是可以完善加強的。
技術使用中遇到的問題和解決過程。
項目中,遇到的主要問題就是用戶的被封禁用戶實時接收到消息並將其進行退出登陸操作,這部分當時想了很久,怎么通過這個服務器實現對用戶狀態變化的實時監測呢,困於這部分,想了好久,突然意識到有個心跳的維持,既然心跳能實時定時檢測用戶目前的在線離線狀態,我就把這部分用戶的狀態檢測也放進去這部分進行實時的檢測,這樣有助於被封禁用戶能即時的退出登陸,給用戶更好的體驗。這個問題解決或還是挺開心的,當時覺得想了這么久的東西一下子找到能利用的地方真的十分開心。
總結
說實話,一開始我覺得實現一個聊天服務器對於我來說難度太過大了,去看那些專業文檔和一些教程也許久沒有頭緒,其中一些內部封裝的細節實在理解不來,但是深入了解之后,感覺,哇,這東西真厲害,原來還可以這么做,與websocket相比自己構建的聊天服務器構建完成后真的很自豪,學習到了很多,到后面,真的和前端一起測試時,發現竟然只有一些拼寫錯誤,一會兒解決后邊正常聊天,看到消息被正常接收和簽收的瞬間,真的十分高興,覺得自己的努力是值得的,真的,在這次軟工實踐中,能學到一門netty技術,真的很充實高興。