设为首页 加入收藏

TOP

Spring Boot webSocket从入门到放弃
2018-12-02 22:09:14 】 浏览:22
Tags:Spring Boot webSocket 入门 放弃

在构建Spring boot项目时已经提供webSocket依赖的勾选。webSocket是TCP之上的一个非常薄的轻量级层 ,webSocket主要的应用场景离不开即时通讯与消息推送,但只要应用程序需要在浏览器和服务器之间来回发送消息,就可以使用webSocket来降低客户端流量与服务器的负载。


下面将基于Spring boot实现一个非常简单的HelloWorld程序,用来熟悉项目构建逻辑。


主要的webSocket依赖


一些js库依赖,这里也使用maven方式导入,官网https://www.webjars.org/


Thymeleaf模板引擎,不用多说了吧


接下来开启webSocket并配置一番


这里从上向下说一下,


1)@EnableWebSocketMessageBroker注解用于开启使用STOMP协议来传输基于代理(MessageBroker)的消息,这时候控制器(controller)开始支持@MessageMapping,就像是使用@requestMapping一样。


2)registerStompEndpoints()方法只写了一行代码:


一是用来注册一个Stomp的节点(endpoint),也就是webSocket的服务端地址,客户端在链接时使用到;


二是withSockJs()方法指定使用SockJS协议。SockJs是一个WebSocket的通信js库,Spring对这个js库进行了后台的自动支持,如果使用它不需要进行过多配置。


3)配置消息代理(MessageBroker),该方法干了两件事,一是启用一个简单的message broker并配置一个或多个前缀来过滤针对代理的目的地(例如以“/topic”为前缀的目的地),该前戳限制了网页客户端设置本地地址时的前戳。 二是设置了一个客户端访问服务端地址的前缀。比如我们设置@MessageMapping("/hello"),那客户端要发送消息到服务器上的地址是 /app/hello。


1)@MessageMapping和@RequestMapping功能类似,用于设置URL映射地址,浏览器向服务器发起请求,需要通过该地址。


需要注意,这里设置路径为/hello,但是客户端需要访问/app/hello,原因前面已经讲述。


2)@SendTo("/topic/greetings") 设置目的地,这里的目的地是站在服务端的角度对客户端而言。客户端也需要设置相同的地址,而且必须使用/topic前戳,前面也已经讲述。


本示例中如果服务器接受到了消息,就会对订阅了@SendTo括号中的地址传送消息。


HelloMessage.java


Greeting.java


在resources/static目录下:


index.html


main.css


app.js


这部分最值得说的就是JS部分了,比较简单主要就是3个点击事件,包括连接、断开、发送消息。


当我们点击了连接后,会新建SockjS对象,并设置服务端的连接点(/gs-gu>


subscribe()方法的第一个参数是注册客户端地址,注意前戳必须是/topic开头,因为在前面服务端已经配置了目的地前戳。与@SendTo中的地址对应。


客户端发送消息只需要调用send()方法,还方法的第一个参数是服务端@MessageMapping地址并且加了指定的/app前戳,第二个参数为header头部信息,第三个是发送的消息内容。



成功实现Hello World程序,下面将通过搭建一个一对一聊天服务器,深入学习更多的socket知识。


在前面我们写了一个自动回复的小例子,用到了@MessageMapping("/hello")和@SendTo("/topic/greetings")两个注解,其实我们还可以使用编程的方式发送消息。


其实很简单,直接引用该消息模板


消息模板内置了一系列方法,比如


这俩方法会包装为消息并将其发送到给定的目的地。


监听webSocket服务器的连接只需要实现ApplicationListener<>接口。代码如下:


监听的所有状态被封装在一个枚举类中,其实还有很多,这里不再一一列举。


有了上面这些知识,我们就可以基于此开发一对一聊天服务器。


webSocket提供的是一个socket框架,并不会帮我们管理session,我们需要自己去编写session管理类,进行session的读写。代码如下:


接着,对STOMP监听类进行扩展。


服务端通过sha.getFirstNativeHeader(">读取到客户端的>


当服务端监听到客户端连接时,会将用户Session>


这里我们使用更可靠的请求下线方式,代码如下:


当收到下线请求时,移除Session>


关于Session,也可以设置一个最大值,超时自动移除。


在一对一服务器中,主要处理的就是一对一的消息发送。大致逻辑是接收客户端消息,分析消息结构,通过SessionMap判断对方是否在线,然后发送相应内容。代码如下:


值得一体的是,关于用户>


Message.java


服务端使用FreeMarker模板引擎返回html网页,代码如下:


通过RESTful形式的URl注册>


chat.html


chat.js


网页客户端的主要逻辑在chat.js中。非常有必要的是在stompClient.connect()方法的第一个参数中传入header头信息,该头部信息必须设置>


其次是在用户断开链接前,会向服务端发送断开通知。


打开两个网页,URl分别为http://localhost:8080/chat/100和http://localhost:8080/chat/101,点击连接。




查看控制台输出:



接下来演示用户101向用户100发送消息:



查看用户100收到信息:



再次查看控制输出:



消息成功发送!


当用户断开链接时,控制台输出为:



关于Spring boot webSocket就先到这里。



编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Spring Boot配置文件全面详解 下一篇C语言求回文素数代码及解析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }