1. 程式人生 > >基於Netty的一個WeoSocket通信服務器與客戶端代碼(非JS代碼)

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

soc AS hub 應用服務 str ram 當前 AR 如果

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

咳咳,在這裏呢,小軒就不多說什麽是WebSocket的,還有呢,小軒為什麽不給出JS-Client代碼?網上太多代碼可以用了。小軒這裏的WebSocket客戶端是非JS客戶端,因為小軒的項目後臺邏輯要與WebSocket服務器通信,所以才搞了個客戶端出來。不多說,先上成果圖。

  1. 啟動WebSocket服務器

技術分享圖片

  1. 啟動項目(客戶端1)

技術分享圖片

  1. 使用ws-js客戶端與服務器建立連接(客戶端2)

技術分享圖片

  1. 調用項目接口,由客戶端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 啟動類

服務端的處理

  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與服務端建立連接的前臺用戶)當然,這裏也可以做到給所以在線用戶發送消息。這裏就不多說了。原理是一樣的。

項目源碼

博文路徑

聯系方式

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