本文首發於本部落格 貓叔的部落格,轉載請申明出處
2019年1月15號-InChat釋出V1.1.3版本
一個輕量級、高效率的支援多端(應用與硬體Iot)的非同步網路應用通訊框架
v1.1.3版本使用說明
歷史更新說明
1.1.2版本
- 捕獲未註冊連結斷開異常,完善異常處理
- 修改專案啟動流程,仿Selector啟動模式
- 新增HTTP介面三個:
傳送通知訊息
,獲取線上使用者數
,獲取線上使用者列表
,暫不支援使用者自定義HTTP介面(對於傳統web API我們希望使用者用自己的框架與流程) - 服務端傳送通知介面改為
enum
處理
1.1.3版本
- 新增SSL加密,實現https與wss功能
- 接受使用者自定義證照(瀏覽器信任與不信任均可以訪問)
- InChat配置可改為分散式或著單機版
- 引入Redis,處理叢集資訊與訊息互通
- 如果有生產需要或者個別需求,發現BUG,歡迎留言,專案會更新新的API
關於InChat的Maven依賴
- fastjson 》 1.2.53
- gson 》 2.8.5
- netty 》 4.1.32.Final
- commons-lang 》 3.5
- slf4j-log4j12 》 1.7.25
- jedis 》 3.0.1
建立專案
建立一個空的Maven專案,並引入InChatMaven包,(注意,請不要使用與本專案相同的包目錄)。
可能你只需要這樣的Maven依賴即可
<dependencies>
<dependency>
<groupId>com.github.UncleCatMySelf</groupId>
<artifactId>InChat</artifactId>
<version>1.1.3</version>
</dependency>
</dependencies>
複製程式碼
對接InChat的介面與實現
InChat啟動引數可以自配置
你只需要繼承InChat的預設配置類InitNetty
即可,如下
public class MyInit extends InitNetty {
/** 自定義啟動監聽埠 */
@Override
public int getWebport() {
return 8090;
}
/** 是否啟動分散式 true-啟動、false-不啟動 */
@Override
public Boolean getDistributed() {
return true;
}
/** 是否啟動加密功能 */
@Override
public boolean isSsl() {
return true;
}
}
複製程式碼
請注意,分散式為測試版,所以暫不支援SSL加密,如果啟動分散式請關閉SSL加密功能
如何自定義證照?
#keytool -genkey -keysize 2048 -validity 365 -keyalg RSA -dnam e "CN=in-chat.cn" -keypass 123456 -storepass 123456 -keystore inchat.jks
keytool為JDK提供的生成證照工具
- keysize 2048 金鑰長度2048位(這個長度的金鑰目前可認為無法被暴力破解)
- validity 365 證照有效期365天
- keyalg RSA 使用RSA非對稱加密演算法
- dname "CN=gornix.com" 設定Common Name為gornix.com,這是我的域名
- keypass 654321 金鑰的訪問密碼為123456
- storepass 123456 金鑰庫的訪問密碼為123456(其實這兩個密碼也可以設定一樣,通常都設定一樣,方便記)
- keystore gornix.jks 指定生成的金鑰庫檔案為inchat.jks
如果你試著自己建立了自己的證照,那麼你需要去重寫
InitNetty
中的幾個資訊:jksFile
,jksStorePassword
,jksCertificatePassword
。 你的jks檔案只需要放到resources
目錄下就好,兩個密碼就是你之前設定相同的密碼。 本專案已經提供了預設的inchat.jks
,請使用者在Maven包中複製並貼上到自己的專案中的resources
資料夾中即可。
獲取聊天訊息資料
此介面與原先一樣,僅修改了方法名
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.3版本的啟動專案變得異常的簡單,你只需要配置啟動的配置工廠即可。但是如果我們啟動了分散式的話,我們還需要配置redis資訊。
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;
//配置分散式Redis地址,埠目前預設的,下一版可以支援修改。
ConfigFactory.RedisIP = "192.168.192.132";
//啟動InChat
InitServer.open();
}
}
複製程式碼
專案效果
啟動成功
DEBUG - -Dio.netty.threadLocalDirectBufferSize: 0
DEBUG - -Dio.netty.maxThreadLocalCharBufferSize: 16384
INFO - 服務端啟動成功【192.168.56.1:8090】
INFO - [RedisConfig.getJedis]:連線成功,測試連線PING->PONG
複製程式碼
如果你開通了分散式,那麼你可以試著啟動兩個應用程式。
DEBUG - -Dio.netty.threadLocalDirectBufferSize: 0
DEBUG - -Dio.netty.maxThreadLocalCharBufferSize: 16384
INFO - 服務端啟動成功【192.168.56.1:8070】
INFO - [RedisConfig.getJedis]:連線成功,測試連線PING->PONG
複製程式碼
讀者可以到專案中使用原來的兩個前端頁面。
分別登入兩個使用者在兩個應用程式,並進行互相通訊即可。啟動分散式請關閉SSL,分散式為測試版,暫不支援SSL
目前,分散式版本接通了點對點與群聊的功能,大家可以試試。下一版本會新增一個分散式的元件用來統一資料與介面功能。
關於加密的,請提前讓電腦認同信任證照
關於分散式的操作效果
關於HTTP介面的,目前與分散式無關
原先的
自我傳送
,點對點傳送
,群聊
,異常處理
,HTTP介面
均與原來一樣
原先的介面說明可以看上一版本: InChatV1.1.2版本使用說明
前端相關
這裡你可以來到InChat的Front-End-Testing文件夾中的chat.html。
你可以直接使用,你進需要修改對應的對接IP即可。
如果你開了SSL加密,你的IP開頭記得改為:
wss://192.168.1.121:8090/ws
!!!
前端可以看原來的版本: InChatV1.1.2版本使用說明
關於資料庫設計
當前一版不會固定大家的資料庫設計,大家可以自己自由設計,同時搭上自己的專案,構建一個附帶IM的自專案。
公眾號:Java貓說
現架構設計(碼農)兼創業技術顧問,不羈平庸,熱愛開源,雜談程式人生與不定期乾貨。