先導入支持websocket的jar包,這里用Gradle構建的項目:
dependencies {
compile('org.springframework.boot:spring-boot-starter-websocket')
}
webSocket的配置文件,實現了WebSocketMessageBrokerConfigurer接口:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
//允許使用socketJs方式訪問,訪問點為webSocket,允許跨域
//在網頁上我們就可以通過這個鏈接
//ws://127.0.0.1:2222/webSocket來和服務器的WebSocket連接
registry.addEndpoint("/webSocket").setAllowedOrigins("*");
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
//基於內存的STOMP消息代理來代替mq的消息代理
//訂閱Broker名稱,/user代表點對點即發指定用戶,/topic代表發布廣播即群發
registry.enableSimpleBroker("/user", "/topic");
//點對點使用的訂閱前綴,不設置的話,默認也是/user/
registry.setUserDestinationPrefix("/user/");
}
}
Javascript客戶端代碼:
var stompClient = null;
//加載完瀏覽器后 調用connect(),打開雙通道
$(function(){
//打開雙通道
connect()
})
//強制關閉瀏覽器 調用websocket.close(),進行正常關閉
window.onunload = function() {
disconnect()
}
function connect(){
var groupId = 1
var socket = new WebSocket("ws://127.0.0.1:2222/webSocket"); //連接SockJS的endpoint名稱為"webSocket"
stompClient = Stomp.over(socket);//使用STMOP子協議的WebSocket客戶端
console.log(stompClient)
stompClient.connect({},function(frame){//連接WebSocket服務端
console.log('Connected:' + frame);
//通過stompClient.subscribe訂閱/topic/getResponse 目標(destination)發送的消息
stompClient.subscribe('/user/'+groupId+'/refresh',function(response){
console.log(response.body);
});
});
}
//關閉雙通道
function disconnect(){
if(stompClient != null) {
stompClient.disconnect();
}
console.log("Disconnected");
}
function showResponse(message){
var response = $("#response");
response.append("<p>"+message.userName+"</p>");
}
如果鏈接成功,瀏覽器會打印如下信息:
點對點通信:
如果下面的接口被調用,服務器就會主動往所有連接服務器的客戶端訂閱了“/user/+“groupId”+/refresh”的路徑推送消息
/**
* websocket刷新流程
* @author metadata
*/
@GetMapping("refresh/{groupId}")
public void refresh(@PathVariable Long groupId) {
simpMessagingTemplate.convertAndSendToUser(groupId.toString(), "/refresh", "refresh");
}
如果該接口被調用,相應的客戶端會接收到如下消息: