本文首發公眾號 Java貓說 & 貓叔的部落格 | MySelf,轉載請申明出處。
前言
首先對於一個簡單的聊天室,大家應該都有一定的概念了,這裡我們省略使用者模組的講解,而是單純的先說說聊天室的幾個功能:自我對話、好友交流、群聊、離線訊息等。
今天我們要做的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)的非同步網路應用通訊框架,大家可以直接來這個專案下獲取前端頁面,或者直接訪問這個地址:github.com/UncleCatMyS…
對於這個前端頁面,我們需要更改一下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
複製程式碼
公眾號:Java貓說
現架構設計(碼農)兼創業技術顧問,不羈平庸,熱愛開源,雜談程式人生與不定期乾貨。