基於Netty的一個WeoSocket通信服務器與客戶端代碼(非JS代碼)
基於Netty的一個WeoSocket通信服務器與客戶端代碼(非JS代碼)
咳咳,在這裏呢,小軒就不多說什麽是WebSocket的,還有呢,小軒為什麽不給出JS-Client代碼?網上太多代碼可以用了。小軒這裏的WebSocket客戶端是非JS客戶端,因為小軒的項目後臺邏輯要與WebSocket服務器通信,所以才搞了個客戶端出來。不多說,先上成果圖。
- 啟動WebSocket服務器
- 啟動項目(客戶端1)
- 使用ws-js客戶端與服務器建立連接(客戶端2)
- 調用項目接口,由客戶端1給客戶端2發送消息。
這裏,小軒可以支持文本消息,也可以支持二進制數據。當然,邏輯寫的很簡單,就是簡單的發送消息。但是可以在此基礎上進行業務邏輯的修改,從而達到符合自己的業務需求。
好了,圖呢,就先到這裏,小軒這邊已經在正常使用中。沒有視頻演示還真是硬傷。
之所以看到tdg_yyx跟連接裏面的不一樣,是因為在小軒的項目中集成的客戶端中加了系統前綴。所以才會有這樣的演示圖。當然,如果想知道具體再怎麽使用的話,依舊可以聯系小軒我哦。
例子中的編碼解碼數據是使用的MsgPack對對象進行了序列化。但是從服務器發給瀏覽器客戶端的時候使用的是文本消息哦。
項目源碼已共享至github中,另起了一個新的repository哦。與之前的demo分開了。可以直接拿下來進行修改的哦。
目錄結構
|- xpush
|——push-client
|————org.yyx.message.push.client
|——————client // 客戶端代碼
|——————config // 從yml文件中加載配置的Netty配置類包
|——————entity // 用來在服務器與客戶端之間進行傳輸的實體類包
|——————handler // WebSocket客戶端處理包
|——————listener // 用於啟動客戶端的監聽器
|——————util // 此處應該寫接口,主要用來做傳輸消息的邏輯
|————PushClientApplication // SpringBoot 啟動類
|——push-server
|————org.yyx.message.push.server
|——————config // 從yml文件中加載配置的Netty配置類包
|——————entity // 用來在服務器與客戶端之間進行傳輸的實體類包
|——————handler // WebSocket服務端處理包
|——————listener // WebSocket服務端監聽器
|——————main // 服務端代碼
|——————util // 此處應該寫接口,主要用來做傳輸消息的邏輯
|————ServerApplication.java // SpringBoot 啟動類
服務端的處理
- WebSocketUrl為ws://localhost:9999/oa/web_socket/{uri} 其中{uri}用來接收業務參數
- 如果服務端接收的消息是文本消息,則返回給客戶端的內容為:你發的消息是:+ 原消息內容
- 如果是二進制數據,則會對其進行解碼,編解碼使用的是MessagePack工具。若想自己開發自己的業務邏輯,可以將handlerWebSocketFrame方法抽出到接口中,根據不同的業務走自己的業務邏輯。在源碼中,服務端和客戶端使用同一個實體類。進行簡易的點對點通信。詳見WebSocketMessageEntity實體類。
客戶端的處理
- 在源碼中,客戶端連接的是本地服務器,連接成功後進行WebSocket通信。url為:ws://127.0.0.1:9999/web_socket/${userName}其中 userName為用戶名。即我自己的業務參數。
- 連接成功後,將userName的Channel保留。當需要給服務端發送消息時,根據用戶名獲取自己與服務器已連接的通道,進行消息傳輸。
- 現在客戶端的處理邏輯是發送二進制數據,指定服務端將消息發送給哪個客戶端。如果有自己的業務邏輯,可根據服務端業務進行相應的修改。
測試用例
- 啟動服務端。
- 將客戶端代碼集成在已有項目中(此處我集成在了一個基於tomcat應用服務器的web項目)
- 啟動客戶端(此處,我將項目以一個用戶的身份與服務端進行通信system_manage)
- 通過web項目的登陸入口,將一個個用戶與服務端進行連接(項目中的前端頁面,使用js直接與服務端通信,但觸發點是登陸系統之後)
- 用戶A發送消息給用戶B
到目前為止,仍然沒有看到客戶端的作用對吧。不急,向下看。
當Web服務器處理了一些業務,需要給當前用戶A發送消息通推送,可以在後臺直接調用客戶端發送消息給用戶的方法,此時,就用到客戶端了。
WEB後臺調用client發送消息的方法,以上面提到的system_manage身份發送消息給指定用戶。消息以二進制數據到達服務端,服務端有寫好的業務邏輯,將消息解碼後,回寫數據給用戶A(沒錯,用戶A就是通過js與服務端建立連接的前臺用戶)當然,這裏也可以做到給所以在線用戶發送消息。這裏就不多說了。原理是一樣的。
項目源碼
博文路徑
聯系方式
基於Netty的一個WeoSocket通信服務器與客戶端代碼(非JS代碼)