WebSocket使用教程 整合springboot
1.pom文件引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2.编写websocket 的配置类 这个配置完成相当于服务webstock
已经配好了
@Configuration
@EnableWebSocket //注解需要写
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
//设置访问路径 ws://locahost/webStock/任意字符 这里是自定义的,/webstock/con 也行
registry.addHandler(zdyWebSocketHandler, "/webStock/**")
.setAllowedOrigins("*");
}
}
3.继承 TextWebSocketHandler 类实现具体业务
public class ZdyWebSocketHandler extends TextWebSocketHandler {
private static CopyOnWriteArraySet<WebSocketSession> sessions = new CopyOnWriteArraySet<>();
/**
* 当WebSocket连接建立后调用
*
* @param session 建立连接的WebSocket会话
* @throws Exception 抛出的异常
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
String requestedPath = session.getUri().getPath();
System.out.println("WebSocket 连接已建立 established: " + session.getId());
sessions.add(session);
session.sendMessage(new TextMessage("WebSocket 连接已建立"));
}
/**
* 处理接收到的文本消息
*
* @param session 发送消息的WebSocket会话
* @param message 接收到的文本消息
* @throws Exception 抛出的异常
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
System.out.println("Received message: " + payload);
// Echo the message back
session.sendMessage(new TextMessage("Echo: " + payload));
}
/**
* 当WebSocket连接关闭后调用
*
* @param session 关闭连接的WebSocket会话
* @param status 连接关闭的状态信息
* @throws Exception 抛出的异常
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session);
System.out.println("WebSocket 已关闭: " + session.getId() + ", status: " + status);
}
/**
* 处理WebSocket传输过程中发生的错误
*
* @param session 发生错误的WebSocket会话
* @param exception 抛出的异常对象
* @throws Exception 抛出的异常
*/
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
System.err.println("WebSocket transport error: " + exception.getMessage());
if (session.isOpen()) {
session.close();
}
sessions.remove(session);
}
/**
* 广播消息给所有连接的客户端
*
* @param message 要广播的消息内容
*/
public static void broadcastMessage(String message) {
sessions.forEach(session -> {
try {
if (session.isOpen()) {
session.sendMessage(new TextMessage(message));
}
} catch (IOException e) {
System.err.println("Error broadcasting message: " + e.getMessage());
}
});
}
}
4.进阶使用,要在 TextWebSocketHandler 类 使用其它服务接口,需要添加构造函数
public class WebSocketConfig implements WebSocketConfigurer {
private final ZdyWebSocketHandler zdyWebSocketHandler;//添加构造函数
public WebSocketConfig (ZdyWebSocketHandler xbimWebSocketHandler) {
this.zdyWebSocketHandler = zdyWebSocketHandler;
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(xbimWebSocketHandler, "/webStock/**") .setAllowedOrigins("*"); }
}
public class ZdyWebSocketHandler extends TextWebSocketHandler {
private static CopyOnWriteArraySet<WebSocketSession> sessions = new CopyOnWriteArraySet<>();
private final ZdyPushInfoService zdyPushInfoService;//其它的服务 添加这个就可以调用
public ZdyWebSocketHandler(ZdyPushInfoService ZdyPushInfoService) {
this.zdyPushInfoService = zdyPushInfoService;
}
/**
* 当WebSocket连接建立后调用
*
* @param session 建立连接的WebSocket会话
* @throws Exception 抛出的异常
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
String requestedPath = session.getUri().getPath();
System.out.println("WebSocket 连接已建立 established: " + session.getId());
sessions.add(session);
session.sendMessage(new TextMessage("WebSocket 连接已建立"));
}
/**
* 处理接收到的文本消息
*
* @param session 发送消息的WebSocket会话
* @param message 接收到的文本消息
* @throws Exception 抛出的异常
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
System.out.println("Received message: " + payload);
// Echo the message back
session.sendMessage(new TextMessage("Echo: " + payload));
}
/**
* 当WebSocket连接关闭后调用
*
* @param session 关闭连接的WebSocket会话
* @param status 连接关闭的状态信息
* @throws Exception 抛出的异常
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session);
System.out.println("WebSocket 已关闭: " + session.getId() + ", status: " + status);
}
/**
* 处理WebSocket传输过程中发生的错误
*
* @param session 发生错误的WebSocket会话
* @param exception 抛出的异常对象
* @throws Exception 抛出的异常
*/
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
System.err.println("WebSocket transport error: " + exception.getMessage());
if (session.isOpen()) {
session.close();
}
sessions.remove(session);
}
/**
* 广播消息给所有连接的客户端
*
* @param message 要广播的消息内容
*/
public static void broadcastMessage(String message) {
sessions.forEach(session -> {
try {
if (session.isOpen()) {
session.sendMessage(new TextMessage(message));
}
} catch (IOException e) {
System.err.println("Error broadcasting message: " + e.getMessage());
}
});
}
}
5.安全验证相关
/**
* 当WebSocket连接建立后调用
*
* @param session 建立连接的WebSocket会话
* @throws Exception 抛出的异常
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
String requestedPath = session.getUri().getPath();
//服务连接进来自己验证是否可以连接
}
6.使用了nginx 后需要配置对应的 ws 服务端口,http 和https 是不一样的
server {
listen80;
server_name 域名;
proxy_http_version 1.1;
……
#启用支持websocket连接的配置
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
location / {
proxy_redirect off;
proxy_pass http://自己的地址;
proxy_connect_timeout 60;
proxy_read_timeout 600;
proxy_send_timeout 600;
}
}
重要的是这两行,它表明是websocket连接进入的时候,进行一个连接升级将http连接变成websocket的连接。
启用支持websocket连接:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy read timeout 表明连接成功以后等待服务器响应的时候,如果不配置默认为60s;
proxy_http_version 1.1;表明使用http版本为1.1
浙公网安备 33010602011771号