一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

SpringBoot的WebSocket实现单聊群聊代码示例

时间:2021-02-25 编辑:袖梨 来源:一聚教程网

本篇文章小编给大家分享一下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
 
 
 
 


请输入聊天内容

热门栏目