基於Netty的一個WeoSocket通訊服務器與客戶端代碼(非JS代碼)

基於Netty的一個WeoSocket通訊服務器與客戶端代碼(非JS代碼)

咳咳,在這裏呢,小軒就很少說什麼是WebSocket的,還有呢,小軒爲何不給出JS-Client代碼?網上太多代碼能夠用了。小軒這裏的WebSocket客戶端是非JS客戶端,由於小軒的項目後臺邏輯要與WebSocket服務器通訊,因此才搞了個客戶端出來。很少說,先上成果圖。前端

  1. 啓動WebSocket服務器java

    1

  2. 啓動項目(客戶端1)git

  3. 使用ws-js客戶端與服務器創建鏈接(客戶端2)github

  4. 調用項目接口,由客戶端1給客戶端2發送消息。web

這裏,小軒能夠支持文本消息,也能夠支持二進制數據。固然,邏輯寫的很簡單,就是簡單的發送消息。可是能夠在此基礎上進行業務邏輯的修改,從而達到符合本身的業務需求。瀏覽器

好了,圖呢,就先到這裏,小軒這邊已經在正常使用中。沒有視頻演示還真是硬傷。tomcat

之因此看到tdg_yyx跟鏈接裏面的不同,是由於在小軒的項目中集成的客戶端中加了系統前綴。因此纔會有這樣的演示圖。固然,若是想知道具體再怎麼使用的話,依舊能夠聯繫小軒我哦。服務器

例子中的編碼解碼數據是使用的MsgPack對對象進行了序列化。可是從服務器發給瀏覽器客戶端的時候使用的是文本消息哦。socket

項目源碼已共享至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 啓動類

服務端的處理

  1. WebSocketUrl爲ws://localhost:9999/oa/web_socket/{uri} 其中{uri}用來接收業務參數
  2. 若是服務端接收的消息是文本消息,則返回給客戶端的內容爲:你發的消息是:+ 原消息內容
  3. 若是是二進制數據,則會對其進行解碼,編解碼使用的是MessagePack工具。若想本身開發本身的業務邏輯,能夠將handlerWebSocketFrame方法抽出到接口中,根據不一樣的業務走本身的業務邏輯。在源碼中,服務端和客戶端使用同一個實體類。進行簡易的點對點通訊。詳見WebSocketMessageEntity實體類。

客戶端的處理

  1. 在源碼中,客戶端鏈接的是本地服務器,鏈接成功後進行WebSocket通訊。url爲:ws://127.0.0.1:9999/web_socket/${userName}其中 userName爲用戶名。即我本身的業務參數。
  2. 鏈接成功後,將userName的Channel保留。當須要給服務端發送消息時,根據用戶名獲取本身與服務器已鏈接的通道,進行消息傳輸。
  3. 如今客戶端的處理邏輯是發送二進制數據,指定服務端將消息發送給哪一個客戶端。若是有本身的業務邏輯,可根據服務端業務進行相應的修改。

測試用例

  1. 啓動服務端。
  2. 將客戶端代碼集成在已有項目中(此處我集成在了一個基於tomcat應用服務器的web項目)
  3. 啓動客戶端(此處,我將項目以一個用戶的身份與服務端進行通訊system_manage)
  4. 經過web項目的登錄入口,將一個個用戶與服務端進行鏈接(項目中的前端頁面,使用js直接與服務端通訊,但觸發點是登錄系統以後)
  5. 用戶A發送消息給用戶B

到目前爲止,仍然沒有看到客戶端的做用對吧。不急,向下看。

當Web服務器處理了一些業務,須要給當前用戶A發送消息通推送,能夠在後臺直接調用客戶端發送消息給用戶的方法,此時,就用到客戶端了。

WEB後臺調用client發送消息的方法,以上面提到的system_manage身份發送消息給指定用戶。消息以二進制數據到達服務端,服務端有寫好的業務邏輯,將消息解碼後,回寫數據給用戶A(沒錯,用戶A就是經過js與服務端創建鏈接的前臺用戶)固然,這裏也能夠作到給因此在線用戶發送消息。這裏就很少說了。原理是同樣的。

項目源碼

博文路徑

聯繫方式

相關文章
相關標籤/搜索