本文首發公衆號與個人博客:Java貓說 & 貓叔的博客 | MySelf,轉載請申明出處。
前言
大家可以看看上一篇:用Java構建一個簡單的WebSocket聊天室
在上一篇文章中我們已經實現了:自我對話、好友交流、羣聊、離線消息等的功能。
而本篇,我們的框架升級了,並且開通了幾個新的HTTP接口功能,同時也把原先框架的一些異常做了處理。
我們將使用更少的代碼完成功能更加完善的聊天項目!
採用框架
我們整個Demo基本不需要大家花費太多時間,就可以實現以下的功能。
- 用戶token登錄校驗
- 自我聊天
- 點對點聊天
- 羣聊
- 獲取在線用戶數與用戶標籤列表
- 發送系統通知
首先,我們需要介紹一下我們今天打算採用的框架,InChat : 一個輕量級、高效率的支持多端(應用與硬件Iot)的異步網絡應用通訊框架,採用這個框架,我們基本上只需要兩三個類就可以實現我們今天需要的功能了。
先看看效果
需要了解SSM & SpringBoot 嗎?
InChat ,本身不依賴於任何的底層框架,所以大家只要會基本的Java語言就可以實現一套自己的WebSocket聊天室。
框架使用手冊(新版V1.1.2剛剛發佈)
關於詳細的手冊說明,大家可以看看官網的介紹:
<dependency>
<groupId>com.github.UncleCatMySelf</groupId>
<artifactId>InChat</artifactId>
<version>1.1.2</version>
</dependency>
開始Demo搭建
構建一個空的Maven項目
我們不需要依賴其他的Maven包,只要本文提及的框架即可。
<dependency>
<groupId>com.github.UncleCatMySelf</groupId>
<artifactId>InChat</artifactId>
<version>1.1.2</version>
</dependency>
InChat啓動參數可以自配置
你只需要繼承InChat的默認配置類InitNetty
即可,如下
public class MyInit extends InitNetty {
/** 自定義啓動監聽端口 */
@Override
public int getWebport() {
return 8090;
}
}
獲取聊天消息數據
此接口與原先一樣,僅修改了方法名
public class DataBaseServiceImpl implements InChatToDataBaseService {
@Override
public Boolean writeMessage(InChatMessage message) {
System.out.println(message.toString());
return true;
}
}
登錄校驗與羣聊消息
此接口沒有做過多的修改
public class VerifyServiceImpl implements InChatVerifyService {
@Override
public boolean verifyToken(String token) {
return true;
}
@Override
public JSONArray getArrayByGroupId(String groupId) {
JSONArray jsonArray = JSONArray.parseArray("[\"1111\",\"2222\",\"3333\"]");
return jsonArray;
}
}
服務端發送通知消息枚舉類
此接口具有Demo模板,用戶需要繼承InChat框架的FromServerService
接口,同時該接口註釋也有實例demo,我們需要實現一個自定義的枚舉,你可以這樣寫:
public enum FromServerServiceImpl implements FromServerService {
//你可以自定義自己的系統消息,請以Integer-String的形式
TYPE1(1,"【系統通知】您的賬號存在異常,請注意安全保密信息。"),
TYPE2(2,"【系統通知】恭喜您連續登錄超過5天,獎勵5積分。");
private Integer code;
private String message;
FromServerServiceImpl(Integer code, String message){
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
//實現接口的方法,遍歷本枚舉的code,獲取對應的消息,作爲系統消息發送
public String findByCode(Object code) {
Integer codes = (Integer)code;
for (FromServerServiceImpl item: FromServerServiceImpl.values()) {
if (item.code == codes){
return item.message;
}
}
return null;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
啓動項目
1.1.2版本的啓動項目變得異常的簡單,你只需要配置啓動的配置工廠即可。
public class application {
public static void main(String[] args) {
//配置你的自定義配置
ConfigFactory.initNetty = new MyInit();
//配置校驗類
ConfigFactory.inChatVerifyService = new VerifyServiceImpl();
//配置消息接收處理類
ConfigFactory.inChatToDataBaseService = new DataBaseServiceImpl();
//配置服務端系統消息枚舉,這裏的值無所謂 TYPE1或者TYPE2或者TYPEN均可以
ConfigFactory.fromServerService = FromServerServiceImpl.TYPE1;
//啓動InChat
InitServer.open();
}
}
項目效果
啓動成功
DEBUG - -Dio.netty.threadLocalDirectBufferSize: 0
DEBUG - -Dio.netty.maxThreadLocalCharBufferSize: 16384
INFO - 服務端啓動成功【192.168.56.1:8090】
當聊天連接未註冊情況下,客戶端自動斷開後,服務會自動包對應的異常
INFO - [Handler:channelInactive]/192.168.56.1:8090關閉成功
ERROR - [捕獲異常:NotFindLoginChannlException]-[Handler:channelInactive] 關閉未正常註冊鏈接!
原先的自我發送
,點對點發送
,羣聊
均與原來一樣原先的接口說明可以看上一版本: v1.1.0-alpha版本使用說明
新功能添加 HTTP
新增HTTP接口三個,在你啓動Inchat的時候,默認啓動,對於你的其他web API並無任何影響,它是一個IM的輔助作用。本版本不支持用戶自定義相關的InChat HTTP接口
獲取在線用戶數
- 地址:
[ip:端口]/get_size
GET - 返回值
{
"code": 200,
"data": {
"online": 1,//當前在線數
"time": "Jan 3, 2019 10:06:45 PM"//查詢時間
}
}
獲取在線用戶標識
- 地址:
[ip:端口]/get_list
GET - 返回值
{
"code": 200,
"data": {
//返回在線用戶列表
"tokens": [
"1111"
]
}
}
根據用戶標籤,發送系統指定消息
- 地址:
[ip:端口]/send_from_server
POST - 參數:
token
(你可以從get_list
中得到在線用戶標籤)、value
(你在系統中添加枚舉的code
值,這裏不接受字符串) - 返回值
{
"code": 400,
"data": {
"message": "通知發送成功"
}
}
(有個小BUG,返回值code應該是200)
關於前端
InChat : 一個輕量級、高效率的支持多端(應用與硬件Iot)的異步網絡應用通訊框架,大家可以直接來這個項目下獲取前端頁面,或者直接訪問這個地址:https://github.com/UncleCatMy...
對於這個前端頁面,我們需要更改一下IP地址。
運行調試項目
接下來直接啓動後端項目,當我們看到以下的信息,則項目啓動成功。
INFO - 服務端啓動成功【192.168.1.121:8090】
這裏的IP需要更換以下讀者啓動後的IP地址。
接着直接用瀏覽器打開chat.html的頁面即可,關於js的方法,大家可以看看InChatV1.1.0版本使用說明。
運行效果已經提前展示啦!
公衆號:Java貓說
現架構設計(碼農)兼創業技術顧問,不羈平庸,熱愛開源,雜談程序人生與不定期乾貨。