websocket
基础
websocket基础
- 协议类型:WebSocket协议使用
ws://(无加密)或wss://(加密)作为URL协议类型。 - 建立连接:客户端通过发起一个HTTP请求与服务器建立WebSocket连接。服务器响应这个请求,并升级连接为WebSocket连接。
- 持久连接:一旦建立,WebSocket连接是持久的,除非客户端或服务器主动关闭连接。
- 全双工通信:客户端和服务器可以同时发送和接收消息,提高了通信效率。
注:websocket没有请求体,参数的传递使用url上的参数
idea技巧
idea的http文件 可以创建websocket连接
扩展
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.核心对象:
- javax.websocket中的Session会话对象 通过map进行存储
//简单的对连接发送一段消息
session.getBasicRemote().sendText(JSON.toJSONString(params));
public static Map<String, Session> sessions = new ConcurrentHashMap<>();
2.springwebsocket
1.继承核心类
- 配置类
implements WebSocketConfigurer
.....
@Override
public void registerWebSocketHandlers(@NonNull WebSocketHandlerRegistry registry) {
registry.addHandler(defaultWebSocketHandler(),
"spring/message")
//可选:添加拦截器
.addInterceptors(webSocketInterceptor())
.setAllowedOrigins("*");
}
2.(可选)拦截器接口
@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 实现这个接口
在配置类中注册这个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编码的字节表示