1. 程式人生 > >InChat版,僅僅兩個接口實現自己的IM系統(可兼容)

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

ssa true http 啟動項 databases 關於 接口 rri ucc

  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的自項目。

  前端效果

  發送人

  

技術分享圖片

  接收人

  

技術分享圖片

  

?

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