學習背景
很久以前就知道WebSocket,但那時不論是瀏覽器還是開發技術對它的支持都還很少。但是,Spring4突然發布,讓我眼前一亮,Spring4直接支持WebSocket。
對於Spring我還是很喜歡的,它讓Java Web開發相當的有藝術感,這次支持的WebSocket又特別的和我的胃口,所以馬上就去學習了。
前提
本文的內容,是建立在懂J2EE編程,使用過Spring,聽說過WebSocket上的,如果前面的3點大家不太明白,可以先去補補知識。
WebSocket還不是很普遍,對服務器和瀏覽器都有要求,不過使用了下面的一些技術,可以將瀏覽器的要求降低,但是服務器容器的要求還是比較高的,具體哪些服務器容易支持了WebSocket可以百度一下。
第一步:配置Spring
如果你跟我一樣采用的Maven,那么只需要將下面的幾個依賴,加入到pom.xml文件就可以了:
- <properties>
- <spring.version>4.0.0.RELEASE</spring.version>
- </properties>
- <dependencies>
- <!--spring MVC-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-web</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <!-- jstl -->
- <dependency>
- <groupId>jstl</groupId>
- <artifactId>jstl</artifactId>
- <version>1.2</version>
- </dependency>
- <!--spring測試框架-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>${spring.version}</version>
- <scope>test</scope>
- </dependency>
- <!--spring數據庫操作庫-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jdbc</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.8.2</version>
- <scope>test</scope>
- </dependency>
- <!--spring websocket庫-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-websocket</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-messaging</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <!--jackson用於json操作-->
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.3.0</version>
- </dependency>
- <dependency>
- <groupId>commons-fileupload</groupId>
- <artifactId>commons-fileupload</artifactId>
- <version>1.2.2</version>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.2</version>
- </dependency>
- <!--使用阿里的連接池-->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid</artifactId>
- <version>1.0.4</version>
- </dependency>
- <!--mysql connector-->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.29</version>
- </dependency>
- </dependencies>
Spring的配置我就不一一貼出來了,可以去github看,地址我會貼在下面。
第二步:配置WebSocket
我采用的是使用Configurer類和 Annotation來進行WebSocket配置。
首先要創建一個類,繼承WebSocketMessageBrokerConfigurer,並且在類上加上annotation:@Configuration和@EnableWebSocketMessageBroker。這樣,Spring就會將這個類當做配置類,並且打開WebSocket。
- @Configuration
- @EnableWebSocketMessageBroker
- public class WebSocketConfig implements WebSocketMessageBrokerConfigurer{
- @Override
- public void registerStompEndpoints(StompEndpointRegistry registry) {
- //添加這個Endpoint,這樣在網頁中就可以通過websocket連接上服務了
- registry.addEndpoint("/coordination").withSockJS();
- }
- @Override
- public void configureMessageBroker(MessageBrokerRegistry config) {
- System.out.println("服務器啟動成功");
- //這里設置的simple broker是指可以訂閱的地址,也就是服務器可以發送的地址
- /**
- * userChat 用於用戶聊天
- */
- config.enableSimpleBroker("/userChat");
- config.setApplicationDestinationPrefixes("/app");
- }
- @Override
- public void configureClientInboundChannel(ChannelRegistration channelRegistration) {
- }
- @Override
- public void configureClientOutboundChannel(ChannelRegistration channelRegistration) {
- }
- }
可以看到,在類中必須實現這四個方法。暫且只需要用到前兩個,所以我來介紹一下,前兩個方法中代碼的意義。
第一個方法,是registerStompEndpoints,大意就是注冊消息連接點(我自己的理解),所以我們進行了連接點的注冊:
- registry.addEndpoint("/coordination").withSockJS();
第二個方法,configureMessageBroker,大意是設置消息代理,也就是頁面上用js來訂閱的地址,也是我們服務器往WebSocket端接收js端發送消息的地址。
- config.enableSimpleBroker("/userChat");
- config.setApplicationDestinationPrefixes("/app");
說了這么多地址,估計大家都繞暈了,因為項目的整個雛形還沒有出來,所以很混亂。所以接下來就配置js端。
第三步:配置Browser端
說了這么多地址,估計大家都繞暈了,因為項目的整個雛形還沒有出來,所以很混亂。所以接下來就配置js端。
首先我們要使用兩個js庫,一個是之前說過的SockJs,一個是stomp,這是一種通信協議,暫時不介紹它,只需要知道是一種更方便更安全的發送消息的庫就行了。
需要連接服務端的WebSocket:
- var socket = new SockJS('/coordination');
- var stompClient = Stomp.over(socket);
- stompClient.connect('', '', function (frame) {});
沒錯,就只需要兩句話。有了這三句話,我們就已經可以連接上了服務器。
使用SockJs還有一個好處,那就是對瀏覽器進行兼容,如果是IE11以下等對WebSocket支持不好的瀏覽器,SockJs會自動的將WebSocket降級到輪詢(這個不知道的可以去百度一下),之前也說了,Spring對SockJs也進行了支持,也就是說,如果之前加了withSockJs那句代碼,那么服務器也會自動的降級為輪詢。(怎么樣,是不是很興奮,Spring這個特性太讓人舒服了)
但是連接上了服務器,卻沒有進行任何的操作,所以下一步,我們要在服務器端撰寫響應和數據處理代碼,在Browser端撰寫消息發送和接收代碼。當然,這是下一篇的內容了。
結語
這是我的畢業設計,我的畢業設計是一個在線協同備課系統,其中包含了聊天這個小功能,所以使用它來講解一下Spring WebSocket的使用。
我將代碼放到了
github上,有興趣的朋友可以去看看代碼,因為涉及到了很多協同操作,所以代碼比較復雜,如果僅僅想了解Spring WebSocket的朋友,還是等我的下一篇文章吧。

github地址:https://github.com/xjyaikj/OnlinePreparation
轉自 http://blog.csdn.net/xjyzxx/article/details/24182677