WebSocket 不做过多得介绍,这里有篇比较全面得文章
我这里是精简版,只挑出核心代码记录。免得浪费大家时间
⒈项目导入依赖
1 23 org.springframework.boot 4spring-boot-starter-websocket 5
⒉编写websocket配置
1 package cn.coreqi.consumer.config; 2 3 import org.springframework.context.annotation.Configuration; 4 import org.springframework.messaging.simp.config.MessageBrokerRegistry; 5 import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; 6 import org.springframework.web.socket.config.annotation.StompEndpointRegistry; 7 import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; 8 9 /**10 * 配置消息代理,默认情况下使用内置的消息代理。11 * @EnableWebSocketMessageBroker 此注解表示使用STOMP协议来传输基于消息代理的消息,此时可以在@Controller类中使用@MessageMapping12 */13 @Configuration14 @EnableWebSocketMessageBroker15 //SpringBoot2.x将extends AbstractWebSocketMessageBrokerConfigurer改为 implements WebSocketMessageBrokerConfigurer16 public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {17 /**18 * 注册 Stomp的端点 配置对外暴露访问的端点19 * @param registry20 */21 @Override22 public void registerStompEndpoints(StompEndpointRegistry registry) {23 registry.addEndpoint("/websocket-simple") //添加STOMP协议的端点。24 // 这个URL是供WebSocket客户端或SockJS客户端连接服务端访问的地址。25 .setAllowedOrigins("*") //添加允许跨域访问26 .withSockJS(); //指定端点使用SockJS协议27 }28 29 /**30 * 配置消息代理31 * @param registry32 */33 @Override34 public void configureMessageBroker(MessageBrokerRegistry registry) {35 //启动简单Broker,客户端请求地址符合配置的前缀,消息才会发送到这个broker36 //客户端订阅当前服务端时需要添加以下请求前缀,topic一般用于广播推送,queue用于点对点推送37 registry.enableSimpleBroker("/userTest","/topicTest");38 //如果不设置下面这一句,使用SimpMessagingTemplate.convertAndSendToUser向指定用户推送消息时39 //订阅前缀只能为/user,例如前端订阅为/user/fanqi/info40 registry.setUserDestinationPrefix("/userTest");41 //客户端(html客户端、java客户端等)向服务端发送消息的请求前缀42 registry.setApplicationDestinationPrefixes("/app");43 }44 45 }
⒊编写控制器
1 package cn.coreqi.consumer.controller; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.messaging.handler.annotation.MessageMapping; 5 import org.springframework.messaging.handler.annotation.SendTo; 6 import org.springframework.messaging.simp.SimpMessagingTemplate; 7 import org.springframework.scheduling.annotation.EnableScheduling; 8 import org.springframework.scheduling.annotation.Scheduled; 9 import org.springframework.stereotype.Controller;10 import org.springframework.web.bind.annotation.RequestMapping;11 12 import java.text.DateFormat;13 import java.text.SimpleDateFormat;14 import java.util.Date;15 16 @Controller17 @EnableScheduling //定时任务支持18 public class WebSocketController {19 20 @Autowired21 private SimpMessagingTemplate messagingTemplate;22 23 24 @RequestMapping("/")25 public String index() {26 return "index";27 }28 29 /**30 * 这里用于客户端推送消息到服务端,推送地址为:setApplicationDestinationPrefixes("/app")设置得前缀加上@MessageMapping注解得地址31 * 此处为/app/send32 * 当前方法处理后将结果转发给@SendTo注解得地址,如果没有指定,则采用默认33 * @MessageMapping 指定要接收消息的地址,类似@RequestMapping。除了注解到方法上,也可以注解到类上34 * @SendTo 默认消息将被发送到与传入消息相同的目的地,但是目的地前面附加前缀(默认情况下为"/topic")35 * @param message 客户端推送过来得消息,一般生产环境会封装36 * @return37 * @throws Exception38 */39 @MessageMapping("/send")40 @SendTo("/topicTest/web-to-server-to-web")41 public String greeting(String message) throws Exception {42 // 模拟延时,以便测试客户端是否在异步工作43 Thread.sleep(1000);44 return "Hello, " + message + "!";45 }46 47 /**48 * 最基本的服务器端主动推送消息给客户端49 * @return50 * @throws Exception51 */52 @Scheduled(initialDelay = 7000,fixedRate = 2000)53 public String serverTime() throws Exception {54 // 发现消息55 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");56 messagingTemplate.convertAndSend("/topicTest/servertime", df.format(new Date()));57 return "servertime";58 }59 60 /**61 * 服务端推送消息到指定用户得客户端62 * 例如以下将会推送到63 * 因为设置了setUserDestinationPrefix("/userTest"),因此推送到/userTest/fanqi/info64 * 如果没有设置setUserDestinationPrefix(),则默认前端为user,将会推送到/user/fanqi/info65 * 客户端订阅/userTest/fanqi/info将会收到服务端推送得消息66 * @return67 * @throws Exception68 */69 @Scheduled(initialDelay = 7000,fixedRate = 2000)70 public String serverTimeToUser() throws Exception {71 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");72 messagingTemplate.convertAndSendToUser("fanqi","/info", df.format(new Date()));73 return "serverTimeToUser";74 }75 }
⒋前端websocket客户端代码
1 2 3 4玩转spring boot——websocket 5 6 7 8 9 65 66 67 68websocket示例
69 70 71 72 73 747578以下是websocket的服务端主动推送消息到页面的例子
76 777982以下是websocket的服务端主动推送消息到页面的例子,只有hzb这个用户收到
80 8183100 101以下是websocket的客户端发消息到服务端,服务端再将该消息返回到客户端(页面)的例子
84 85 86 8788 89
9990 92 93 94消息内容: 9195 97 98{ {messageContent}} 96