1. 程式人生 > >用Java構建一個簡單的WebSocket聊天專案之新增HTTP介面排程

用Java構建一個簡單的WebSocket聊天專案之新增HTTP介面排程

本文首發公眾號與個人部落格:Java貓說 & 貓叔的部落格 | MySelf,轉載請申明出處。

前言

大家可以看看上一篇:用Java構建一個簡單的WebSocket聊天室

在上一篇文章中我們已經實現了:自我對話、好友交流、群聊、離線訊息等的功能。

而本篇,我們的框架升級了,並且開通了幾個新的HTTP介面功能,同時也把原先框架的一些異常做了處理。

我們將使用更少的程式碼完成功能更加完善的聊天專案!

採用框架

我們整個Demo基本不需要大家花費太多時間,就可以實現以下的功能。

  • 使用者token登入校驗
  • 自我聊天
  • 點對點聊天
  • 群聊
  • 獲取線上使用者數與使用者標籤列表
  • 傳送系統通知

首先,我們需要介紹一下我們今天打算採用的框架,InChat : 一個輕量級、高效率的支援多端(應用與硬體Iot)的非同步網路應用通訊框架,採用這個框架,我們基本上只需要兩三個類就可以實現我們今天需要的功能了。

先看看效果

demo

log

postman

send

需要了解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版本使用說明

new

log

新功能新增 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)

send

result

關於前端

InChat : 一個輕量級、高效率的支援多端(應用與硬體Iot)的非同步網路應用通訊框架,大家可以直接來這個專案下獲取前端頁面,或者直接訪問這個地址:github.com/UncleCatMyS…

對於這個前端頁面,我們需要更改一下IP地址

執行除錯專案

接下來直接啟動後端專案,當我們看到以下的資訊,則專案啟動成功。

 INFO - 服務端啟動成功【192.168.1.121:8090】
複製程式碼

這裡的IP需要更換以下讀者啟動後的IP地址。

接著直接用瀏覽器開啟chat.html的頁面即可,關於js的方法,大家可以看看InChatV1.1.0版本使用說明

執行效果已經提前展示啦!

公眾號:Java貓說

現架構設計(碼農)兼創業技術顧問,不羈平庸,熱愛開源,雜談程式人生與不定期乾貨。

Image Text