网站搭建有免费的吗,茂名网站建设维护,建设信用卡在网站挂失块吗,网站建设优化培训班说明#xff1a;本文介绍如何在Spirng Boot中整合WebSocket#xff0c;WebSocket介绍#xff0c;参考下面这篇文章#xff1a;
WebSocket
原始方式
原始方式#xff0c;指的是使用Spring Boot自己整合的方式#xff0c;导入的是下面这个依赖
dependencyg…说明本文介绍如何在Spirng Boot中整合WebSocketWebSocket介绍参考下面这篇文章
WebSocket
原始方式
原始方式指的是使用Spring Boot自己整合的方式导入的是下面这个依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-websocket/artifactId
/dependencyStep1创建WebSocket类
创建一个WebSocket服务类如下
import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;/*** WebSocket服务*/
Component
ServerEndpoint(/ws/{sid})
public class WebSocketServer {// 存放会话对象private static MapString, Session sessionMap new HashMap();/*** 客户端连接建立成功调用的方法*/OnOpenpublic void onOpen(Session session, PathParam(sid) String sid) {System.out.println(客户端 sid 建立连接);sessionMap.put(sid, session);}/*** 收到客户端消息后调用的方法** param message 客户端发送过来的消息*/OnMessagepublic void onMessage(String message, PathParam(sid) String sid) {System.out.println(收到来自客户端 sid 的信息: message);}/*** 连接关闭调用的方法** param sid*/OnClosepublic void onClose(PathParam(sid) String sid) {System.out.println(连接断开: sid);sessionMap.remove(sid);}/*** 群发** param message*/public void sendToAllClient(String message) {CollectionSession sessions sessionMap.values();for (Session session : sessions) {try {//服务器向客户端发送消息session.getBasicRemote().sendText(message);} catch (Exception e) {e.printStackTrace();}}}
}Step2注入IOC中
将WebSocketServer注入到IOC容器中如下
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;/*** WebSocket配置类用于注册WebSocket的Bean*/
Configuration
public class WebSocketConfiguration {Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}Step3创建任务
如下创建一个服务器主动推送给客户端的任务每5秒推送消息给客户端
在这里插入代码片import com.hezy.websocket.WebSocketServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;Component
public class WebSocketTask {Autowiredprivate WebSocketServer webSocketServer;/*** 通过WebSocket每隔5秒向客户端发送消息*/Scheduled(cron 0/5 * * * * ?)public void sendMessageToClient() {webSocketServer.sendToAllClient(这是来自服务端的消息 DateTimeFormatter.ofPattern(HH:mm:ss).format(LocalDateTime.now()));}
}Step4启动类增加注解
启动类需要增加EnableWebSocket注解EnableScheduling注解是开启定时任务的配合定时器注解Scheduled(cron 0/5 * * * * ?)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.socket.config.annotation.EnableWebSocket;/*** author hezhongying* create 2024/7/27 14:05*/
SpringBootApplication
EnableScheduling
EnableWebSocket
public class Start {public static void main(String[] args) {SpringApplication.run(Start.class, args);}
}Step5启动测试
启动使用Apifox测试选择新建WebSocket接口
填上地址端口号是8080这一点和后面使用第三方框架不同 连接成功可以看到代码中的消息定时推送到客户端 以上就是使用Spring Boot原始的方式整合WebSocket
使用第三方框架
使用第三方框架GitHub地址netty-websocket-spring-boot-starter的方式整合WebSocket非常容易如下
Step1引入依赖
在pom.xml文件中引入下面依赖
dependencygroupIdorg.yeauty/groupIdartifactIdnetty-websocket-spring-boot-starter/artifactIdversion0.12.0/version
/dependencyStep2创建WebSocket类
在GitHub上把类拷贝过来如下
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.timeout.IdleStateEvent;
import org.springframework.util.MultiValueMap;
import org.yeauty.annotation.*;
import org.yeauty.pojo.Session;import java.io.IOException;
import java.util.Map;ServerEndpoint(host ${ws.host}, port ${ws.port}, path /ws)
public class MyWebSocket {BeforeHandshakepublic void handshake(Session session, HttpHeaders headers, RequestParam String req, RequestParam MultiValueMap reqMap, PathVariable String arg, PathVariable Map pathMap){session.setSubprotocols(stomp);if (!ok.equals(req)){System.out.println(Authentication failed!);session.close();}}OnOpenpublic void onOpen(Session session, HttpHeaders headers, RequestParam String req, RequestParam MultiValueMap reqMap, PathVariable String arg, PathVariable Map pathMap){System.out.println(new connection);System.out.println(req);}OnClosepublic void onClose(Session session) throws IOException {System.out.println(one connection closed); }OnErrorpublic void onError(Session session, Throwable throwable) {throwable.printStackTrace();}OnMessagepublic void onMessage(Session session, String message) {System.out.println(message);session.sendText(Hello Netty!);}OnBinarypublic void onBinary(Session session, byte[] bytes) {for (byte b : bytes) {System.out.println(b);}session.sendBinary(bytes); }OnEventpublic void onEvent(Session session, Object evt) {if (evt instanceof IdleStateEvent) {IdleStateEvent idleStateEvent (IdleStateEvent) evt;switch (idleStateEvent.state()) {case READER_IDLE:System.out.println(read idle);break;case WRITER_IDLE:System.out.println(write idle);break;case ALL_IDLE:System.out.println(all idle);break;default:break;}}}
}Step3增加配置
在配置文件中新增以下配置表示websocket接收的主机和端口如下
# websocket配置
ws:host: 0.0.0.0port: 90Step4启动测试
启动项目使用apifox测试 填上websocket服务地址和端口记得加上一个参数reqok因为我们上面代码里有个判断 连接成功 Message里面写需要发送的内容发送 可以看到发送到消息成功同时也接收到了服务端传递过来的消息就是说此时如果代码里需要发送消息给客户端就可以主动发送消息过来可以基于上面的代码写自己的业务逻辑。 另外
其中相关注解可以查看GitHub中的文档我也在摸索中 总结
本文介绍了Spring Boot使用WebSocket的两种方式