用Java構建一個簡單的WebSocket聊天項目之新增HTTP接口調度

本文首發公衆號與我的博客: Java貓說 & 貓叔的博客 | MySelf,轉載請申明出處。

前言

你們能夠看看上一篇: 用Java構建一個簡單的WebSocket聊天室

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

而本篇,咱們的框架升級了,而且開通了幾個新的HTTP接口功能,同時也把原先框架的一些異常作了處理。前端

咱們將使用更少的代碼完成功能更加完善的聊天項目!java

採用框架

咱們整個Demo基本不須要你們花費太多時間,就能夠實現如下的功能。git

  • 用戶token登陸校驗
  • 自我聊天
  • 點對點聊天
  • 羣聊
  • 獲取在線用戶數與用戶標籤列表
  • 發送系統通知

首先,咱們須要介紹一下咱們今天打算採用的框架,InChat : 一個輕量級、高效率的支持多端(應用與硬件Iot)的異步網絡應用通信框架,採用這個框架,咱們基本上只須要兩三個類就能夠實現咱們今天須要的功能了。github

先看看效果

demo

log

postman

send

須要瞭解SSM & SpringBoot 嗎?

InChat ,自己不依賴於任何的底層框架,因此你們只要會基本的Java語言就能夠實現一套本身的WebSocket聊天室。web

框架使用手冊(新版V1.1.2剛剛發佈)

關於詳細的手冊說明,你們能夠看看官網的介紹:json

<dependency>
    <groupId>com.github.UncleCatMySelf</groupId>
    <artifactId>InChat</artifactId>
    <version>1.1.2</version>
</dependency>

開始Demo搭建

構建一個空的Maven項目

咱們不須要依賴其餘的Maven包,只要本文說起的框架便可。segmentfault

<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)的異步網絡應用通信框架,你們能夠直接來這個項目下獲取前端頁面,或者直接訪問這個地址:https://github.com/UncleCatMy...

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

運行調試項目

接下來直接啓動後端項目,當咱們看到如下的信息,則項目啓動成功。

INFO - 服務端啓動成功【192.168.1.121:8090】

這裏的IP須要更換如下讀者啓動後的IP地址。

接着直接用瀏覽器打開chat.html的頁面便可,關於js的方法,你們能夠看看InChatV1.1.0版本使用說明

運行效果已經提早展現啦!

公衆號:Java貓說

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

Image Text

相關文章
相關標籤/搜索