Tomcat8.0 支持的WebSocket 總結

Java WebSocket

依賴環境tomcat8.0及以上

兩種配置方式

1.註解式配置

//示例代碼

@ServerEndpoint("/chat")

public class Chat{

//建立連接時調用,可傳入的參數Session(WebSocket的Session,在SpringWebSocket裏面則是WebSocketSession),EndpointConfig,和帶@PathParam注的參數

@OnOpen

public void onOpen(Session session,EndpoingConfig config){


}

//消息到來時調用,可傳入的參數Session(WebSocket的Session,在SpringWebSocket裏面則是WebSocketSession),根據消息的形式,如果是文本消息,傳入String類型參數或者Reader,如果是二進制消息,傳入byte[]類型參數或者InputStream,如果Pong消息傳入實現了PongMessage接口的類型參數,方法還可以帶返回類型,如果有返回類型,比如String(還可以是byte[]或ByteBuffer),則是立即向客戶端發送String消息,如果是分片消息(消息有whole,partial兩種,全部消息和分片消息),還可傳入boolean類型的參數,判斷是否到了分片的結尾。

@OnMessage//處理文本消息

public void onMessage(Session session,String message,boolean isLast){


}

@OnMessage//處理二進制消息,參數隨便搭配

public void onMessage(Session session,byte[] message,boolean isLast){


}


//傳輸發生錯誤時調用,可傳入參數Session,Throwable

@OnError

public void onError(Session session,Throwable t){


}


@OnClose//連接關閉時調用,可能一方主動關閉,或者連接超時的關閉

public void onClose(CloseReason cr){


}

}


2.編程式配置//繼承Endpoint

public class Program extends Endpoint{


@Override

public void onOpen(Session session, EndpointConfig endpointConfig) {

session.addMessageHandler(new MessageHandler.Whole<String>() {

@Override

public void onMessage(String text) {

try {

//可以獲取同步的遠程端點和同步的,以此發送同步消息或異步消息

mySession.getBasicRemote().sendText("I got this (" +text + ") so I am sending it back !");

} catch (IOException ioe) {

System.out.println("oh dear, something went wrong trying to send the message back: " + ioe.getMessage());

}

}

});

}

//還有onError()和onClose()方法,不寫了

}

//配置映射uri,實現ServerApplicationConfig

public class ProgramAppConfig implements ServerApplicationConfi{

//參數是WebSocket會傳入掃描到的所有帶有@ServerEndpoint註解的類集合,WebSocket會調用這個方法獲取這些集合,如果沒什麼要做的,直接把參數返回就行了

public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned){

return scanned;

}

//WebSocket會傳入繼承了Endpoint類的集合,但是返回的是ServerEndpointConfig集合,需要做一個轉換

public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> endpointClasses){

Set<ServerEndpointConfiguration> configs = new HashSet<ServerEndpointConfiguration>();

ServerEndpointConfiguration sec = ServerEndpointConfigurationBuilder.create(Program .class, "/program").build();

configs.add(sec);

return configs;

}


}

線程安全問題

每次請求Webocket都會實例化一個新的端點,就像HttpSession一樣,請求之間互補干擾,不需要我們處理多線程問題


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章