【websocket】Netty-Socketio API

netty-socketio是基於netty的socket.io服務實現,可以無縫對接前端使用的socketio-client.js。
相對於javaee的原生websocket支持(@serverEndpoint)和spring-boot的MessageBroker(@messageMapping),netty-socketio絕對是最好用的websocket後臺實現。因爲netty-socketio完整的實現了socket.io提供的監聽前臺事件、向指定客戶端發送事件、將指定客戶端加入指定房間、向指定房間廣播事件、客戶端從指定房間退出等操作。


Netty-Socketio主要類和方法如下:

  • SocketIOClient
    客戶端接口,其實現類是NamespaceClient,主要方法如下:
joinRoom() 加入到指定房間。
leaveRoom() 從指定房間離開。
getSessionId()方法,返回由UUID生成的唯一標識。
getAllRooms() 返回當前客戶端所在的room名稱列表。
sendEvent(eventname,data) 向當前客戶端發送事件。
  • 1
  • 2
  • 3
  • 4
  • 5

  • SocketIOServer
    服務端實例,對應node版的Server對象,主要方法如下:
getAllClients() 返回默認名稱空間中的所有客戶端實例。
getBroadcastOperations() 返回默認名稱空間的所有實例組成的廣播對象。
getRoomOperations() 返回所有命名空間中指定房間的廣播對象,如果命名空間只有一個,該方法到可以大膽使用。
getClient(uid) 返回默認名稱空間的指定客戶端。
getNamespace() 返回指定名稱的命名空間。
  • 1
  • 2
  • 3

  • Namespace
    命名空間。與node版的namespace一模一樣,作爲socketio的java實現版,netty-socketio忠實的重現了socketio的server–>namespace–room三層嵌套關係。
    SocketIOServer通過NamespacesHub對象持有namespace的對象列表,藉助NamespacesHub的CRUD方法,SocketIOServer實現了對namespace的管理。
    從NamespacesHub的getRoomClients方法可以知道,SocketIOServer的getRoomOperations方法返回的是所有namespace中指定room中的客戶端實例。而不是指定命名空間或者默認命名空間的,使用該方法的時候要小心。如果要獲取指定命名空間的指定room中的客戶端,一定要先拿到指定namespace對象。
    Namespace中的主要方法如下:
getAllClients() 獲得本namespace中的所有客戶端。
getClient() 獲得指定id客戶端對象。
getRoomClients(room) 獲得本空間中指定房間中的客戶端。
getRooms() 獲得本空間中的所有房間。
getRooms(client) 獲得指定客戶端所在的房間列表。
leave(room,uuid) 將指定客戶端離開指定房間,如果房間中已無客戶端,刪除該房間。
getBroadcastOperations 返回針對空間中所有客戶端的廣播對象。
getRoomOperations(room) 返回針對指定房間的廣播對象。
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • 8

  • BroadcastOperations
    廣播操作對象,通過對Namespace的瞭解我們知道,BroadcastOperations都是命名空間以指定room中的clients列表爲參數創建的。
    BroadcastOperations中最通用的方法便是sendEvent方法,該方法遍歷clients,通過執行客戶端的send方法實現廣播目的。也可以設定一個排除對象,當然用於排除發送者自己了。
sendEvent(eventname,data) 向本廣播對象中的全體客戶端發送廣播。
sendEvent(eventname,excludeSocketIOClient,data) 排除指定客戶端廣播。
  • 1
  • 2

  • AckRequest
    AckRequest是一個爲了實現socketio中客戶端emit函數的第三個參數而定義的類。
    socket.io-client.js
    ack是一個客戶端的一個回調函數,客戶端觸發的事件如果被服務端收到,服務端可以觸發該函數的執行。
    SocketIOServer的事件監聽方法第三個參數便是對應的AckRequest對象,可以使用sendAckData方法設置回調參數。

“`
public void onData(final SocketIOClient client, ChatObject data, final AckRequest ackRequest) {

if (ackRequest.isAckRequested()) {
ackRequest.sendAckData(“client message was delivered to server!”, “yeah!”);
}

}


  • AckCallback
    同樣的,既然服務端可以執行客戶端的回調函數,那客戶端也可以做同樣的事情。AckCallback和VoidAckCallback便是netty-socketio模擬的服務端回調函數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章