2015-11-12 191 views
4

例如,我有一間有什麼辦法在Java中創建動態的@ServerEndpoint地址?

public class Room { 
    private int id; 
    private Set<User> users; 
} 

所以,我希望它是端點我WebSocket的應用。但是可能會有很多房間,我希望每個人都可以擁有自己的URI(例如,房間/ 1,房間/ 2等)。

很明顯,@ServerEnpoint註釋只允許常量。那麼,有什麼辦法可以做到嗎?

回答

3

事情是這樣的:

@ServerEndpoint(value = "/rooms/{roomnumber}") 
public class.... 

static Map<String, Session> openSessions = ... 
@OnOpen 
public void onConnectionOpen(final Session session, @PathParam("roomnumber") final String roomnumber, 
... 
    //store roomnumber in session 
    session.getUserProperties().put("roomnumber", roomnumber); 
    openSessions.put(String.valueOf(session.getId()), session) 

要只發送短信給特定roomnumbers /客戶端:

// check if session corresponds to the roomnumber 
    for (Map.Entry<String, Session> entry : openSessions.entrySet()) { 

    Session s = entry.getValue(); 
    if (s.isOpen() && s.getUserProperties().get("roomnumber").equals(roomnumber_you_want_to_address)) { 
    ... 

當一個客戶端斷開連接:

@OnClose 
public void onConnectionClose(Session session) { 
    openSessions.remove(session.getId()); 
} 
+0

我真的不知道這是我需要 我的意思是我必須有實例在運行時關聯端點的東西。例如,我創建了Room的新實例,並將其映射到必要的地址。 我還需要服務器發送消息給那些連接到這個URI的客戶端。 如果我讓它像你提供的,我真的不能想象我怎麼能做到這一點 –

+0

我更新了我的答案。 – sinclair

+0

好的,我明白了。性能好嗎? –

-2

您可以爲每個使用該函數來映射具有不同變量的請求在同一個控制器中

@RequestMapping(value = "/endpoint/{endpointVariable}", method = RequestMethod.GET) 
public ReturnDTO getReturnDTO(<params>){ 
    // Here the variable, endpointVariable, will be accessible 
    // In my experiences its always been an integer, but I'm sure a string 
    // would be possible. check with debugger 
} 

http://www.journaldev.com/3358/spring-mvc-requestmapping-annotation-example-with-controller-methods-headers-params-requestparam-pathvariable

+1

問題是關於WebSocket而不是Spring MVC ! '@ ServerEndpoint'是'javax.websocket.server'包的註釋。 – shimatai

+0

確實......我提供了一些並不完全回答問題的東西。 –

相關問題