您的位置:首页 > 编程语言 > Java开发

Spring WebSocket初探1 (Spring WebSocket入门教程)

2017-07-13 17:45 330 查看
http://www.jianshu.com/p/60799f1356c5

See more: Spring
WebSocket reference

整个例子属于WiseMenuFrameWork的一部分,可以将整个项目Clone下来,如果朋友们有需求,我可以整理一个独立的demo出来。

WebSocket是html5带来的一项重大的特性,使得浏览器与服务端之间真正长连接交互成为了可能,这篇文章会带领大家窥探一下Spring 对WebSocket的支持及使用。


1. 基础环境

快速搭建Spring框架,我们使用Spring boot,这里先不讨论SpringBoot,只知道它是一个“快速搭建Spring项目的一站式解决方案”就OK了。

要使用Spring的WebSocket功能,我们需要添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

这样就轻松开启了WebSocket基础功能。


2. 相关配置

下面我们来配置WebSocket。

首先新增一个WebSocketConfig类,定义全局的配置信息,使用JavaConfig的形式:
WebSocketConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/socket").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/app");
}
}


相关说明:
registerStompEndpoints(StompEndpointRegistry registry)


这个方法的作用是添加一个服务端点,来接收客户端的连接。
registry.addEndpoint("/socket")
表示添加了一个
/socket
端点,客户端就可以通过这个端点来进行连接。
withSockJS()
的作用是开启SockJS支持,

configureMessageBroker(MessageBrokerRegistry config)


这个方法的作用是定义消息代理,通俗一点讲就是设置消息连接请求的各种规范信息。
registry.enableSimpleBroker("/topic")
表示客户端订阅地址的前缀信息,也就是客户端接收服务端消息的地址的前缀信息(比较绕,看完整个例子,大概就能明白了)
registry.setApplicationDestinationPrefixes("/app")
指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀

上面两个方法定义的信息其实是相反的,一个定义了客户端接收的地址前缀,一个定义了客户端发送地址的前缀

到目前为止,整个框架的配置信息已经完成,下面我们来写一个发送公告的例子,展示一下WebSocket的魅力!


3. 编写后台业务

有了上述的基本配置信息,我们就可以编写基本功能了。这里先简单说明两个知识点:
MessageMapping

Spring对于WebSocket封装的特别简单,提供了一个
@MessageMapping
注解,功能类似
@RequestMapping
,它是存在于
Controller
中的,定义一个消息的基本请求,功能也跟
@RequestMapping
类似,包括支持通配符``的url定义等等,详细用法参见Annotation
Message Handling
SimpMessagingTemplate
SimpMessagingTemplate
是Spring-WebSocket内置的一个消息发送工具,可以将消息发送到指定的客户端。
下面我们来实现:
新建一个
GreetingController

@Controller
public class GreetingController {
@Resource
private SimpMessagingTemplate simpMessagingTemplate;
@RequestMapping("/helloSocket")
public String index(){
return "/hello/index";
}
@MessageMapping("/change-notice")
public void greeting(String value){
this.simpMessagingTemplate.convertAndSend("/topic/notice", value);
}
}


相关说明:
index()

指定了一个页面,用来实现WebSocket客户端发送公告功能,使用的是
@RequestMapping
,所以接收的是http请求,进行页面跳转。
greeting(String value)

这个方法是接收客户端发送功公告的WebSocket请求,使用的是
@MessageMapping

this.simpMessagingTemplate.convertAndSend("/topic/notice", value)


这个方法官方给出的解释是
Convert the given Object to serialized form, possibly using a MessageConverter, wrap
it as a message and send it to the given destination.
 意思就是“将给定的对象进行序列化,使用‘MessageConverter’进行包装转化成一条消息,发送到指定的目标”,通俗点讲就是我们使用这个方法进行消息的转发发送!

前面我们全局配置中指定了服务端接收的连接以 
app
大头,所以客户端发送公告的请求连接应该是
/app/change-notice


服务端代码就这么简单,跟写SpringMVC类似,同样上面的
geeting(String value)
方法我们还可以使用另一个注解
@SendTo
换成另一种写法。
@MessageMapping("/change-notice")
@SendTo("/topic/notice")
public String greeting(String value) {
return value;
}


相关说明:

改进后的代码更简单,着重理解一下
@SendTo

@SendTo
定义了消息的目的地。结合例子解释就是“接收
/app/change-notice
发来的value,然后将value转发到
/topic/notice
客户端。
/topic/notice
是客户端发起连接后,订阅服务端消息时指定的一个地址,用于接收服务端的返回,后面我们在写客户端代码的时候会看见。

到目前为止,服务端代码Coding完毕!下一篇文章我们来写客户端功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: