websocket+springwebsocket快速入门

1,269 阅读3分钟

websocket

基础

websocket基础

  1. 协议类型:WebSocket协议使用ws://(无加密)或wss://(加密)作为URL协议类型。
  2. 建立连接:客户端通过发起一个HTTP请求与服务器建立WebSocket连接。服务器响应这个请求,并升级连接为WebSocket连接。
  3. 持久连接:一旦建立,WebSocket连接是持久的,除非客户端或服务器主动关闭连接。
  4. 全双工通信:客户端和服务器可以同时发送和接收消息,提高了通信效率。

注:websocket没有请求体,参数的传递使用url上的参数

idea技巧

idea的http文件 可以创建websocket连接

image.png

image.png

扩展

1.原生websocket注解

1.添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2.spring容器启动

相关对象和注解在javax.websocket包当中,但是可以使用spring org.springframework的关于bean的注解,快速启动

@Configuration
public class WebSocketConfig {

    /**
     * 注入ServerEndpointExporter, 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}

上一个注解是javax的,下面一个注解注册这个bean

@ServerEndpoint(value = "/websocket/{userId}")
@Component

3.核心对象:

  1. javax.websocket中的Session会话对象 通过map进行存储
//简单的对连接发送一段消息
session.getBasicRemote().sendText(JSON.toJSONString(params));

public static Map<String, Session> sessions = new ConcurrentHashMap<>();

2.springwebsocket

1.继承核心类
  1. 配置类
implements WebSocketConfigurer
.....

@Override
public void registerWebSocketHandlers(@NonNull WebSocketHandlerRegistry registry) {

   
    registry.addHandler(defaultWebSocketHandler(),
          "spring/message")
    //可选:添加拦截器      
    .addInterceptors(webSocketInterceptor())

          .setAllowedOrigins("*");
}


image.png 2.(可选)拦截器接口

image.png

    @Override
    public boolean beforeHandshake(@NonNull ServerHttpRequest request, @NonNull ServerHttpResponse response,
          @NonNull WebSocketHandler wsHandler, @NonNull Map<String, Object> attributes) {

       if (request instanceof ServletServerHttpRequest) {
          ServletServerHttpRequest servletServerHttpRequest = (ServletServerHttpRequest) request;


          String userId = servletServerHttpRequest.getServletRequest().getParameter("uid");
          // TODO 判断用户是否存在
        
        
          attributes.put("user",userId);
          return true;
       }
       return false;
    }

    @Override
    public void afterHandshake(@NonNull ServerHttpRequest request, @NonNull ServerHttpResponse response,
          @NonNull WebSocketHandler wsHandler, Exception exception) {
       System.out.println("握手完成");

    }

3.handler 实现这个接口

image.png

在配置类中注册这个bean

public class WebSocketInterceptor implements HandshakeInterceptor 
@Bean
public DefaultWebSocketHandler defaultWebSocketHandler() {
    return new DefaultWebSocketHandler();
}
2.常见对象
WebSocketSession
TextMessage
WebSocketSession

WebSocketSession对象封装了与WebSocket连接相关的上下文信息,它代表了客户端与服务器之间的WebSocket连接。WebSocketSession提供了一系列的方法和属性,用于管理和操作WebSocket会话。以下是一些关键的属性和方法:

  • getId() :返回会话的唯一标识符。
  • getHandshakeHeaders() :返回与握手请求相关的HTTP头信息。
  • getPrincipal() :返回与WebSocket会话关联的Principal对象。
  • getAttributes() :返回与WebSocket会话关联的属性映射。
  • getRemoteAddress() :返回远程地址(客户端地址)。
  • getRemotePort() :返回远程端口。
  • isOpen() :返回一个布尔值,指示会话是否仍然打开。
  • close() :关闭会话。
  • getBinaryMessageSizeLimit() :返回服务器接收二进制消息的最大大小。
  • getTextMessageSizeLimit() :返回服务器接收文本消息的最大大小。
  • getMaxIdleTime() :返回会话的最大空闲时间。
  • getMaxBinaryMessageBufferSize() :返回服务器接收二进制消息时的最大缓冲区大小。
  • getMaxTextMessageBufferSize() :返回服务器接收文本消息时的最大缓冲区大小。
  • getBrowserInfo() :返回客户端浏览器的元数据信息。
  • getUserAgent() :返回客户端的用户代理字符串。
TextMessage

TextMessage对象封装了文本消息,它实现了Message接口,并且通常被用来传输UTF-8编码的文本数据。TextMessage提供了一些方法来操作文本消息,例如:

  • getPayloadAsString() :返回消息的UTF-8编码的字符串表示。
  • getPayloadAsBytes() :返回消息的UTF-8编码的字节表示。
  • getPayloadLength() :返回消息的长度。
  • getPayload() :返回消息的UTF-8编码的字节表示