WebSocket是一种在单个TCP连接上进行全双工通信的协议
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
实现方式
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
WebSocketConfig
package com.yang.config;
/**
* @Author: chen yang
* @Date: 2021/12/9 12:20
* @Description: 通过这个配置 Springboot 才能去扫描后面关于websocket的注解
*/
@Configuration
@EnableWebSocket
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpoint(){
return new ServerEndpointExporter();
}
}
WsServerEndpoint
package com.yang.config;
/**
* @Author: chen yang
* @Date: 2021/12/9 12:24
* @Description:
*/
@ServerEndpoint("/myWs")
@Component
public class WsServerEndpoint {
/**
* 连接成功
* @param session
*/
@OnOpen
public void onOpen(Session session) throws IOException {
session.getBasicRemote().sendText("连接成功");
System.out.println("连接成功 "+session);
}
/**
* 关闭连接
* @param session
*/
@OnClose
public void onClose(Session session) throws IOException {
session.getBasicRemote().sendText("关闭连接");
System.out.println("关闭连接 "+session);
}
/**
* 接受到消息
* @param msg
* @return
*/
@OnMessage
public String onMgs(String msg){
System.out.println("接受的消息:"+msg);
return "消息已接受: "+ msg;
}
/**
* 错误信息
* @param session
*/
@OnError
public void onError(Session session, Throwable error){
System.out.println(session+" ERROR! "+error);
}
}
说明
这里有几个注解需要注意一下,首先是他们的包都在 javax.websocket 下。并不是 spring 提供的,而 jdk 自带的,下面是他们的具体作用。
-
@ServerEndpoint
-
通过这个 spring boot 就可以知道你暴露出去的 ws 应用的路径,有点类似我们经常用的@RequestMapping。比如你的启动端口是 8080,而这个注解的值是 ws,那我们就可以通过 ws://127.0.0.1:8080/ws 来连接你的应用
-
@OnOpen
-
当 websocket 建立连接成功后会触发这个注解修饰的方法,注意它有一个 Session 参数
-
@OnClose
-
当 websocket 建立的连接断开后会触发这个注解修饰的方法,注意它有一个 Session 参数
-
@OnMessage
-
当客户端发送消息到服务端时,会触发这个注解修改的方法,它有一个 String 入参表明客户端传入的值
-
@OnError
-
当 websocket 建立连接时出现异常会触发这个注解修饰的方法,注意它有一个 Session 参数
另外一点就是服务端如何发送消息给客户端,服务端发送消息必须通过上面说的 Session 类,通常是在@OnOpen 方法中,当连接成功后把 session 存入 Map 的 value,key 是与 session 对应的用户标识,当要发送的时候通过 key 获得 session 再发送,这里可以通过 *session.getBasicRemote().sendText(*)** 来对客户端发送消息。
发送消息
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/95918.html