InChat一版,僅僅兩個接口實現自己的IM系統(可兼容)

InChat 一個IM通訊框架

一個輕量級、高效率的支持多端(應用與硬件Iot)的異步網絡應用通訊框架。(核心底層Netty)

Github:InChat

版本目標:完成基本的消息通訊(僅支持文本消息),離線消息存儲,歷史消息查詢,一對一聊天、自我聊天、羣聊等。

你可以使用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依賴即可

<dependencies>
    <dependency>
        <groupId>com.github.UncleCatMySelf</groupId>
        <artifactId>InChat</artifactId>
        <version>1.0-alpha</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

注入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<String, Object> 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

Image

啓動項目

接着啓動項目即可啦

當你看到這個日誌就標誌着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的自項目。

前端效果

發送人

Image

接收人

Image


圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章