websocket是基于http协议实现的,为了解决http只能由客户端请求服务器端进行访问的解决方案。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在springboot中可以导入spring-boot-starter-websocket依赖进行使用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
package com.zsl.config.websocket;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* @Author zsl
* @Date 2022/1/23 17:12
*/
@Configuration
@EnableWebSocket //开启websocket
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
package com.zsl.config.websocket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
/**
* 原生 websocket 基本使用
* @Author zsl
* @Date 2022/1/23 17:57
*/
@Slf4j
@Service
@ServerEndpoint("/api/websocket") // websocket接口与@RequestMapping功能相同 url: ws://ip:port/api/websocket
public class WebSocketServer {
/**
* 建立连接,基于http(三次握手)协议
*/
@OnOpen
public void onOpen(Session session) {
log.info("onOpen...");
}
/**
* 关闭连接
*/
@OnClose
public void onClose() {
log.info("onClose...");
}
/**
* 数据传输
*/
@OnMessage
public void onMessage(String text, Session session) {
log.info("onMessage... text = {}", text);
try {
session.getBasicRemote().sendText("echo: " + text);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 出现异常时执行
*/
@OnError
public void onError(Session session, Throwable t) {
log.info("onError...");
log.debug("throwable = {}", t.getMessage());
}
}
通过这个 spring boot 就可以知道你暴露出去的 ws 应用的路径,有点类似我们经常用的@RequestMapping。比如你的启动端口是 8080,而这个注解的值是 ws,那我们就可以通过 ws://127.0.0.1:8080/ws 来连接你的应用
当 websocket 建立连接成功后会触发这个注解修饰的方法,注意它有一个 Session 参数
当 websocket 建立的连接断开后会触发这个注解修饰的方法,注意它有一个 Session 参数
当客户端发送消息到服务端时,会触发这个注解修改的方法,它有一个 String 入参表明客户端传入的值
当 websocket 建立连接时出现异常会触发这个注解修饰的方法,注意它有一个 Session 参数