用Java構建一個簡單的WebSocket聊天室

前言

首先對於一個簡單的聊天室,大家應該都有一定的概念了,這裏我們省略用戶模塊的講解,而是單純的先說說聊天室的幾個功能:自我對話、好友交流、羣聊、離線消息等。

今天我們要做的demo就能幫我們做到這一點啦!!!

採用框架

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

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

需要了解SSM & SpringBoot 嗎?

InChat ,本身不依賴於任何的底層框架,所以大家只要會基本的Java語言就可以實現一套自己的WebSocket聊天室。

框架使用手冊

關於詳細的手冊說明,大家可以看看官網的介紹:InChatV1.1.0版本使用說明

開始Demo搭建

構建一個空的Maven項目

我們不需要依賴其他的Maven包,只要本文提及的框架即可。

com.github.UncleCatMySelfInChat1.1.0-alpha

對接兩個接口與實現

一個是框架提供給我們用戶進行數據保存與讀取的,通過這個接口的實現,我們可以異步拿到每個聊天的通信數據。這裏的InChatMessage是一個框架自定義的通信對象。

public class ToDataBaseServiceImpl implements InChatToDataBaseService{

    @Override
    public Boolean writeMapToDB(InChatMessage message) {
        System.out.println(message.toString());
        return true;
    }
}

還有一個接口是對登錄的校驗(這裏我們審理用戶登錄與校驗模塊,所以直接返回true即可),還有一個是返回羣聊的數組信息

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;
    }
}

我們可以再詳細的說下,獲取羣聊信息,是通過一個groupId來獲取對應的用戶Id數組,我們可以自己做一個數據查詢。

核心的框架啓動代碼

直接上代碼,然後我們再講解一下。

public class DemoApplication {

    public static void main(String[] args) {
        //配置InChat配置工廠
        ConfigFactory.inChatToDataBaseService = new ToDataBaseServiceImpl();
        ConfigFactory.inChatVerifyService = new verifyServiceImpl();
        //默認啓動InChat
        InitServer initServer = new InitServer(new InitNetty());
        initServer.open();

        //獲取用戶值
        WebSocketChannelService webSocketChannelService = new WebSocketChannelService();

        //啓動新線程
        new Thread(new Runnable() {
            @Override
            public void run() {
                //設定默認服務器發送值
                Map map = new HashMap<>();
                map.put("server","服務器");
                //獲取控制檯用戶想發送的用戶Token
                Scanner scanner = new Scanner(System.in);
                String token = scanner.nextLine();
                //獲取用戶連接
                Channel channel = (Channel) webSocketChannelService.getChannel(token);
                //調用接口發送
                webSocketChannelService.sendFromServer(channel,map);
            }
        }).start();
    }

}

好了,以上已經基本完成了我們的聊天室Demo了,是不是很簡單!?

首先,我們將實現的兩個類,配置到框架的配置工廠中,然後啓動框架即可,相關的類,都是框架提供的。下面的線程是一個框架的接口,以服務器第一人稱發送給針對用戶通知信息,輸入“1111”,Demo演示的用戶token值。

關於前端

InChat : 一個輕量級、高效率的支持多端(應用與硬件Iot)的異步網絡應用通訊框架,大家可以直接來這個項目下獲取前端頁面,或者直接訪問這個地址:https://github.com/UncleCatMy...

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

運行調試項目

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

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

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

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

運行效果如下:

 INFO - 服務端啓動成功【192.168.1.121:8090】
DEBUG - -Dio.netty.buffer.bytebuf.checkAccessible: true
DEBUG - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@68ad4247
 INFO - [DefaultWebSocketHandler.channelActive]/192.168.1.121:17330鏈接成功
DEBUG - -Dio.netty.recycler.maxCapacityPerThread: 4096
DEBUG - -Dio.netty.recycler.maxSharedCapacityFactor: 2
DEBUG - -Dio.netty.recycler.linkCapacity: 16
DEBUG - -Dio.netty.recycler.ratio: 8
DEBUG - [id: 0xabb0dbad, L:/192.168.1.121:8090 - R:/192.168.1.121:17330] WebSocket version V13 server handshake
DEBUG - WebSocket version 13 server handshake key: JYErdeATDgbPmgK0mZ+IlQ==, response: YK9ZiJehNP+IwtlkpoVkPt94yWY=
DEBUG - Decoding WebSocket Frame opCode=1
DEBUG - Decoding WebSocket Frame length=31
 INFO - [DefaultWebSocketHandler.textdoMessage.LOGIN]
DEBUG - Encoding WebSocket Frame opCode=1 length=33
DEBUG - Decoding WebSocket Frame opCode=1
DEBUG - Decoding WebSocket Frame length=43
 INFO - [DefaultWebSocketHandler.textdoMessage.SENDME]
1111
DEBUG - Encoding WebSocket Frame opCode=1 length=28
 INFO - 【異步寫入數據】
InChatMessage{time=Mon Dec 24 10:03:00 CST 2018, type='sendMe', value='', token='1111', groudId='null', online='null', onlineGroup=null, one='null'}
DEBUG - Decoding WebSocket Frame opCode=1
DEBUG - Decoding WebSocket Frame length=56
 INFO - [DefaultWebSocketHandler.textdoMessage.SENDTO]
1111
DEBUG - Encoding WebSocket Frame opCode=1 length=41
 INFO - 【異步寫入數據】
InChatMessage{time=Mon Dec 24 10:03:01 CST 2018, type='sendTo', value='', token='1111', groudId='null', online='2222', onlineGroup=null, one='2222'}
DEBUG - Decoding WebSocket Frame opCode=1
DEBUG - Decoding WebSocket Frame length=60
 INFO - [DefaultWebSocketHandler.textdoMessage.SENDGROUP]
1111
DEBUG - Encoding WebSocket Frame opCode=1 length=59
 INFO - 【異步寫入數據】
InChatMessage{time=Mon Dec 24 10:03:02 CST 2018, type='sendGroup', value='', token='1111', groudId='2', online='null', onlineGroup=[2222, 3333], one='null'}
1111
DEBUG - Encoding WebSocket Frame opCode=1 length=22

圖片描述

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