首發:個人博客
必須說明:這篇博文只用於自己記錄,使用spring的websocket支持一定要看官方文檔,權威又簡明,不推薦看不專業又啰嗦的國產博文。
已嘗試了兩種方法,當然,不管哪種方法都要先添加maven依賴:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
</dependency><dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
</dependency>
第一種方法,對應文檔中的25.2這一節:
1)聲明個Handler組件:
@Component
public class MyHandler extends TextWebSocketHandler {@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) {
try {
session.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}}
2)在spring配置文件中配置該組件,注意要寫在springmvc的配置文件中而不是spring主配置文件中:
<!-- websocket配置1 -->
<websocket:handlers>
<websocket:mapping path="/myHandler" handler="myHandler"/>
</websocket:handlers>
當然,添加這段配置之前要在xml的根節點beans節點上補充這個聲明讓spring認識websocket前綴:
xmlns:websocket="http://www.springframework.org/schema/websocket"
3)這就OK了
第二種方法,對應文檔中的25.4這一節:
實際是參考了官方的引導文檔(一定要看),然后基於參考手冊把java配置改為xml配置了。
1)在某個controller中聲明:
@MessageMapping("/say")
@SendTo("/topic/greetings")
public String greeting(String message) throws Exception {
return message;
}
2)在springmvc配置文件中添加:
<websocket:message-broker application-destination-prefix="/app">
<websocket:stomp-endpoint path="/hello">
<websocket:sockjs />
</websocket:stomp-endpoint>
<websocket:simple-broker prefix="/topic" />
</websocket:message-broker>
3)測試的頁面太長了就不貼了,到這里找吧,在頁面的中下部分。
如果懶得找就看官方提供的示例程序中測試頁面。
總結:
websocket的意義在讓瀏覽器和服務器保持長連接。
在websocket之前如果想保持長連接,或者采用輪詢的方法,或者采用服務器端阻塞的方法,顯然都浪費性能。
如果用服務器端阻塞的話,編程中讀請求(阻塞的)和寫請求(由用戶操作觸發)也是分開的。
websocket直接就分開它們倆了,瀏覽器隨時可以向服務器中寫指令,服務器也隨時可以向瀏覽器寫指令,兩者都有觸發函數監聽對方。
這是對無狀態的http協議非常重要的補充。
html5技術很大方面就是讓B/S自帶富客戶端編程元素,比如本地存儲,長連接這些,這也是單頁面程序興起的重要原因。
真正是一個頁面就是一個程序,有界面顯示,有操作控件,有臨時數據,有持久數據,有與服務器保持的連接。