InChat版,僅僅兩個介面實現自己的IM系統(可相容)
InChat 一個IM通訊框架
一個輕量級、高效率的支援多端(應用與硬體Iot)的非同步網路應用通訊框架。(核心底層Netty)
版本目標:完成基本的訊息通訊(僅支援文字訊息),離線訊息儲存,歷史訊息查詢,一對一聊天、自我聊天、群聊等。
你可以使用InChat,快速搭建一個基於SpringBoot的IM專案,而且沒有任何硬性要求,你完全可以相容自己原有的專案。
v1.0.0版本使用說明
關於InChat的Maven依賴
fastjson 》 1.2.53
gson 》 2.8.5
netty 》 4.1.32.Final
commons-lang 》 3.5
aspectj 》 1.9.2
lombok 》 1.18.4
spring-boot 》 2.0.2.RELEASE
spring-boot-starter-websocket
關於一版依舊使用SpringBoot的環境,同時為應用注入了web環境,引入InChat依賴包後,對於SpringBoot相關的web可以無需引入,同時請注意相關版本的相容性。
引入InChat預設可以自動執行web環境。
建立專案
建立一個空的Maven專案,並引入InChatMaven包,(注意,請不要使用與本專案相同的包目錄)。
可能你只需要這樣的Maven依賴即可
com.github.UncleCatMySelf
InChat
1.0-alpha
org.springframework.boot
spring-boot-starter-test
test
注入InChat的專案到自身專案中
你可能需要在你的專案上進行報掃描
@SpringBootApplication
@ComponentScan({com.inchat}) //你的demo包目錄
@ComponentScan({com.github.unclecatmyself}) //InChat的包目錄 --請將InChat的放到最下面
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
對接InChat的介面與實現
這次你僅需寫兩個實現介面即可啦!!!
@Service
public class ToDataBaseServiceImpl implements InChatToDataBaseService{
@Override
public Boolean writeMapToDB(Map maps) {
//非同步寫入資料庫
System.out.println(maps.toString());
return true;
}
}
這個介面是每個人通訊的資訊,InChat自帶實現了非同步的資料外拋得介面InChatToDataBaseService,目前一版只有一個方法,
就是上面得writeMapToDB,你僅需要map的內容轉為對應的物件(一版還沒提供對應的轉換類,下一版對提供),並將資料存入自己喜歡的資料庫中。
如果資料併發大,也可以先放到MQ中,再寫入資料庫。
@Service
public class verifyServiceImpl implements InChatVerifyService {
@Override
public boolean verifyToken(String token) {
//登入校驗
return true;
}
@Override
public JSONArray getArrayByGroupId(String groupId) {
//根據群聊id獲取對應的群聊人員ID
JSONArray jsonArray = JSONArray.parseArray([\1111\,\2222\,\3333\]);
return jsonArray;
}
}
這個介面是InChat的校驗層實現,對於Token的校驗就是,verifyToken,websocket連結的時候,你將在初次做登入校驗,你可以將從InChat拿到的websocket傳過來的
Token,你可以與自己的使用者登入的token做校驗,返回true,則使用者成功連結InChat。
關於getArrayByGroupId,目前是否應該放在這個介面中還有待確定,不過目前一版暫時這樣,你可以去資料庫中查詢對應的群聊id所對應的人員ID(或Token),並返回對應的
JSONArray即可啦。
自定義配置InChat引數
這個你可以直接在application中按照自己的意思配置,不過你最好先了解netty
啟動專案
接著啟動專案即可啦
當你看到這個日誌就標誌著Inchat搭建成功了!!!
2018-12-14 10:29:09.269 INFO 4920 --- [ BOSS_1] c.g.u.bootstrap.NettyBootstrapServer : 服務端啟動成功【192.168.1.121:8090】
關於前端
這裡你可以來到InChat的Front-End-Testing文件夾中的chat.html。
你可以直接使用,你進需要修改對應的對接IP即可。
關於前端的js暫時還是模板
關於登入
你會看到chat.html中的登入按鈕對應的js
function send(value) {
if (!window.WebSocket) {
return;
}
if (socket.readyState == WebSocket.OPEN) {
var message = {
type: login, //與InChat對應的 不可修改
token: 1111
}
socket.send(JSON.stringify(message));
} else {
alert(連線沒有開啟.);
}
}
本demo,預設登入的Token是“1111”,關於使用者校驗則直接返回true即可。
登入成功,返回以下內容。(不需要顯示給使用者看)
{success:true,type:login}
InChat不會有登入記錄
傳送給自己
你會看到chat.html中的登入按鈕對應的js
function sendToMe(value) {
if (!window.WebSocket) {
return;
}
if (socket.readyState == WebSocket.OPEN) {
var message = {
type: sendMe, //與InChat對應的 不可修改
value: value, //傳送的內容
token: 1111 //傳送使用者的token
}
socket.send(JSON.stringify(message));
} else {
alert(連線沒有開啟.);
}
}
傳送成功,InChat返回內容.(你僅需將value顯示到前端即可)
{type:sendMe,value:傳送給自己的內容}
InChat訊息記錄,你將在非同步訊息中接受到InChat傳遞給你的使用者通訊訊息,你可以進行對應的入庫操作
{time:2018-12-14 10:56:24,type:sendMe,value:傳送給自己的內容,token:1111}
傳送給某人
你會看到chat.html中的登入按鈕對應的js
function sendToOne(value) {
if (!window.WebSocket) {
return;
}
if (socket.readyState == WebSocket.OPEN) {
var message = {
type : sendTo, //與InChat對應的 不可修改
token : 1111, //傳送使用者Token
value: value, //傳送內容
one: 2222, //接受使用者Token(唯一標識)
}
socket.send(JSON.stringify(message));
} else {
alert(連線沒有開啟.);
}
}
傳送成功,接受的使用者是否登入,你都能接受到返回資訊。(value應用於自己介面展示)
{one:2222,type:sendTo,value:傳送給朋友的內容}
但是使用者那邊就不一樣了。
登入正常線上。
{from:1111,type:sendTo,value:傳送給朋友的內容}
離線接受不到資訊
InChat非同步訊息推送,你可以看到兩種
線上: {one:2222,time:2018-12-14 11:01:36,type:sendTo,value:傳送給朋友的內容,token:1111}
離線: {one:2222,time:2018-12-14 10:59:04,on_online:2222,type:sendTo,value:傳送給朋友的內容,token:1111}
如果出現使用者傳送給使用者的狀態是離線的,則會在訊息多出on_online的欄位,該欄位的內容就是離線使用者的Token,你可以針對性的資料入庫,並在使用者上線的時候,讀寫資訊的時候,有一個未讀訊息的狀態。
傳送群聊
你會看到chat.html中的登入按鈕對應的js
function sendGroup(value) {
if (!window.WebSocket) {
return;
}
if (socket.readyState == WebSocket.OPEN) {
var message = {
type: sendGroup, //與InChat對應的 不可修改
groupId: 2, //群聊ID
token: 1111, //傳送使用者的Token
value: value //傳送的訊息
}
socket.send(JSON.stringify(message));
} else {
alert(連線沒有開啟.);
}
}
傳送成功,本人將接受到訊息
{groupId:2,from:1111,type:sendGroup,value:大家明天一起去唱K吧}
群組中有些人線上接受、離線不接受
線上:{groupId:2,from:1111,type:sendGroup,value:大家明天一起去唱K吧}
InChat非同步訊息入庫,群組只會非同步給你一個訊息,你可以看到on_online中,3333使用者是沒有接受到資訊的,所以你可以在他上線傳送未讀訊息。
{groupId:2,time:2018-12-14 11:09:17,on_online:[3333],type:sendGroup,value:大家明天一起去唱K吧,token:1111}
關於資料庫設計
當前一版不會固定大家的資料庫設計,大家可以自己自由設計,同時搭上自己的專案,構建一個附帶IM的自專案。
前端效果
傳送人
接收人