本篇文章小编给大家分享一下SpringBoot的WebSocket实现单聊群聊代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
在HTTP协议中,所有的请求都是由客户端发送给服务端,然后服务端发送请求
要实现服务器向客户端推送消息有几种methods:
1、轮询
大量无效请求,浪费资源
2、长轮询
有新数据再推送,但这会导致连接超时,有一定隐患
3、Applet和Flash
过时,安全隐患,兼容性不好
消息群发
创建新项目:
添加依赖:
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-websocket org.webjars sockjs-client 1.1.2 org.webjars jquery 3.3.1 org.webjars stomp-websocket 2.3.3 org.webjars webjars-locator-core
创建WebSocket配置类:WebSocketConfig
@Configuration @EnableWebSocketMessageBroker//注解开启webSocket消息代理 public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { /** * 配置webSocket代理类 * @param registry */ @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); //代理消息的前缀 registry.setApplicationDestinationPrefixes("/app"); //处理消息的方法前缀 } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/chat").withSockJS(); //定义一个/chat前缀的endpioint,用来连接 } }
创建Bean
/** * 群消息类 */ public class Message { private String name; private String content; //省略getter& setter }
定义controller的方法:
/** * MessageMapping接受前端发来的信息 * SendTo 发送给信息WebSocket消息代理,进行广播 * @param message 页面发来的json数据封装成自定义Bean * @return 返回的数据交给WebSocket进行广播 * @throws Exception */ @MessageMapping("/hello") @SendTo("/topic/greetings") public Message greeting(Message message) throws Exception { return message; }
Title
私聊
既然是私聊,就要有对象目标,也是用户,可以用SpringSecurity引入
所以添加额外依赖:
org.springframework.boot spring-boot-starter-security
配置SpringSecurity
@Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Bean PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("panlijie").roles("admin").password("$2a$10$5Pf0KhCdnrpMxP5aRrHvMOsvV2fvfWJqk0SEDa9vQ8OWwV8emLFhi") .and() .withUser("suyanxia").roles("user").password("$2a$10$5Pf0KhCdnrpMxP5aRrHvMOsvV2fvfWJqk0SEDa9vQ8OWwV8emLFhi"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and() .formLogin() .permitAll(); } }
在原来的WebSocketConfig配置类中修改:也就是多了一个代理消息前缀:"/queue"
@Configuration @EnableWebSocketMessageBroker//注解开启webSocket消息代理 public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { /** * 配置webSocket代理类 * @param registry */ @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic","/queue"); //代理消息的前缀 registry.setApplicationDestinationPrefixes("/app"); //处理消息的方法前缀 } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/chat").withSockJS(); //定义一个/chat前缀的endpioint,用来连接 } }
创建Bean:
public class Chat { private String to; private String from; private String content; //省略getter& setter }
添加controller方法:
/** * 点对点发送信息 * @param principal 当前用户的信息 * @param chat 发送的信息 */ @MessageMapping("chat") public void chat(Principal principal, Chat chat) { //获取当前对象设置为信息源 String from = principal.getName(); chat.setFrom(from); //调用convertAndSendToUser("用户名","路径","内容"); simpMessagingTemplate.convertAndSendToUser(chat.getTo(), "/queue/chat", chat); }
创建页面:
Title 请输入聊天内容