最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot的WebSocket實(shí)現(xiàn)單聊群聊

 更新時(shí)間:2021年02月25日 17:24:48   作者:皮皮大蝦  
這篇文章主要為大家詳細(xì)介紹了SpringBoot的WebSocket實(shí)現(xiàn)單聊群聊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了SpringBoot的WebSocket實(shí)現(xiàn)單聊群聊,供大家參考,具體內(nèi)容如下

說(shuō)在開(kāi)頭

在HTTP協(xié)議中,所有的請(qǐng)求都是由客戶端發(fā)送給服務(wù)端,然后服務(wù)端發(fā)送請(qǐng)求
要實(shí)現(xiàn)服務(wù)器向客戶端推送消息有幾種methods:

1、輪詢

大量無(wú)效請(qǐng)求,浪費(fèi)資源

2、長(zhǎng)輪詢

有新數(shù)據(jù)再推送,但這會(huì)導(dǎo)致連接超時(shí),有一定隱患

3、Applet和Flash

過(guò)時(shí),安全隱患,兼容性不好

消息群發(fā)

創(chuàng)建新項(xiàng)目:

添加依賴:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
 </dependency>
 <dependency>
  <groupId>org.webjars</groupId>
  <artifactId>sockjs-client</artifactId>
  <version>1.1.2</version>
 </dependency>
 <dependency>
  <groupId>org.webjars</groupId>
  <artifactId>jquery</artifactId>
  <version>3.3.1</version>
 </dependency>
 <dependency>
  <groupId>org.webjars</groupId>
  <artifactId>stomp-websocket</artifactId>
  <version>2.3.3</version>
 </dependency>
 <dependency>
  <groupId>org.webjars</groupId>
  <artifactId>webjars-locator-core</artifactId>
</dependency>

創(chuàng)建WebSocket配置類:WebSocketConfig

@Configuration
@EnableWebSocketMessageBroker//注解開(kāi)啟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();  //定義一個(gè)/chat前綴的endpioint,用來(lái)連接
 }
}

創(chuàng)建Bean

/**
 * 群消息類
 */
public class Message {
 private String name;
 private String content;
//省略getter& setter
}

定義controller的方法:

/**
 * MessageMapping接受前端發(fā)來(lái)的信息
 * SendTo 發(fā)送給信息WebSocket消息代理,進(jìn)行廣播
 * @param message 頁(yè)面發(fā)來(lái)的json數(shù)據(jù)封裝成自定義Bean
 * @return 返回的數(shù)據(jù)交給WebSocket進(jìn)行廣播
 * @throws Exception
 */
 @MessageMapping("/hello")
 @SendTo("/topic/greetings")
 public Message greeting(Message message) throws Exception {
 return message;
 }
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <script src="/webjars/jquery/jquery.min.js"></script>
 <script src="/webjars/sockjs-client/sockjs.min.js"></script>
 <script src="/webjars/stomp-websocket/stomp.min.js"></script>
 <script>
 var stompClient = null;
 //點(diǎn)擊連接以后的頁(yè)面改變
 function setConnected(connection) {
  $("#connect").prop("disable",connection);
  $("#disconnect").prop("disable",!connection);
  if (connection) {
  $("#conversation").show();
  $("#chat").show();

  } else {
  $("#conversation").hide();
  $("#chat").hide();
  }
  $("#greetings").html("");
 }
 //點(diǎn)擊連接按鈕建立連接
 function connect() {
  //如果用戶名為空直接跳出
  if (!$("#name").val()) {
  return;
  }
  //創(chuàng)建SockJs實(shí)例,建立連接
  var sockJS = new SockJS("/chat");
  //創(chuàng)建stomp實(shí)例進(jìn)行發(fā)送連接
  stompClient = Stomp.over(sockJS);
  stompClient.connect({}, function (frame) {
  setConnected(true);
  //訂閱服務(wù)端發(fā)來(lái)的信息
  stompClient.subscribe("/topic/greetings", function (greeting) {
   //將消息轉(zhuǎn)化為json格式,調(diào)用方法展示
   showGreeting(JSON.parse(greeting.body));
  });
  });
 }
 //斷開(kāi)連接
 function disconnect() {
  if (stompClient !== null) {
  stompClient.disconnect();
  }
  setConnected(false);
 }
 //發(fā)送信息
 function sendName() {
  stompClient.send("/app/hello",{},JSON.stringify({'name': $("#name").val() , 'content': $("#content").val()}));
 }
 //展示聊天房間
 function showGreeting(message) {
  $("#greetings").append("<div>"+message.name + ":" + message.content + "</div>");
 }
 $(function () {
  $("#connect").click(function () {
  connect();
  });
  $("#disconnect").click(function () {
  disconnect();
  });
  $("#send").click(function () {
  sendName();
  })
 })
 </script>
</head>
<body>
<div>
 <label for="name">用戶名</label>
 <input type="text" id="name" placeholder="請(qǐng)輸入用戶名">
</div>
<div>
 <button id="connect" type="button">連接</button>
 <button id="disconnect" type="button">斷開(kāi)連接</button>
</div>
<div id="chat" style="display: none;">
 <div>
 <label for="name"></label>
 <input type="text" id="content" placeholder="聊天內(nèi)容">
 </div>
 <button id="send" type="button">發(fā)送</button>
 <div id="greetings">
 <div id="conversation" style="display: none;">群聊進(jìn)行中</div>
 </div>
</div>
</body>
</html>

私聊

既然是私聊,就要有對(duì)象目標(biāo),也是用戶,可以用SpringSecurity引入
所以添加額外依賴:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-security</artifactId>
</dependency>

配置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();
 }
}

在原來(lái)的WebSocketConfig配置類中修改:也就是多了一個(gè)代理消息前綴:"/queue"

@Configuration
@EnableWebSocketMessageBroker//注解開(kāi)啟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();  //定義一個(gè)/chat前綴的endpioint,用來(lái)連接
 }
}

創(chuàng)建Bean:

public class Chat {
 private String to;
 private String from;
 private String content;
//省略getter& setter
}

添加controller方法:

 /**
 * 點(diǎn)對(duì)點(diǎn)發(fā)送信息
 * @param principal 當(dāng)前用戶的信息
 * @param chat 發(fā)送的信息
 */
 @MessageMapping("chat")
 public void chat(Principal principal, Chat chat) {
 //獲取當(dāng)前對(duì)象設(shè)置為信息源
 String from = principal.getName();
 chat.setFrom(from);
 //調(diào)用convertAndSendToUser("用戶名","路徑","內(nèi)容");
 simpMessagingTemplate.convertAndSendToUser(chat.getTo(), "/queue/chat", chat);
 }

創(chuàng)建頁(yè)面:

<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <script src="/webjars/jquery/jquery.min.js"></script>
 <script src="/webjars/sockjs-client/sockjs.min.js"></script>
 <script src="/webjars/stomp-websocket/stomp.min.js"></script>
 <script>
 var stompClient = null;
 function connect() {
  var socket = new SockJS("/chat");
  stompClient = Stomp.over(socket);
  stompClient.connect({}, function (frame) {
  stompClient.subscribe('/user/queue/chat', function (chat) {
   showGreeting(JSON.parse(chat.body));
  });
  });
 }
 function sendMsg() {
  stompClient.send("/app/chat",{},JSON.stringify({'content' : $("#content").val(), 'to': $("#to").val()}));
 }
 function showGreeting(message) {
  $("#chatsContent").append("<div>" + message.from + ":" + message.content + "</div>");
 }
 $(function () {
  connect();
  $("#send").click(function () {
  sendMsg();
  });
 });
 </script>
</head>
<body>
<div id="chat">
 <div id="chatsContent">
 </div>
 <div>
 請(qǐng)輸入聊天內(nèi)容
 <input type="text" id="content" placeholder="聊天內(nèi)容">
 <input type="text" id="to" placeholder="目標(biāo)用戶">
 <button type="button" id="send">發(fā)送</button>
 </div>
</div>
</body>
</html>

暫結(jié)!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)視頻時(shí)間維度剪切的工具類

    Java實(shí)現(xiàn)視頻時(shí)間維度剪切的工具類

    這篇文章主要為大家詳細(xì)介紹了將視頻按照時(shí)間維度進(jìn)行剪切的Java工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • IDEA如何修改maven的JVM啟動(dòng)內(nèi)存參數(shù)

    IDEA如何修改maven的JVM啟動(dòng)內(nèi)存參數(shù)

    這篇文章主要介紹了IDEA如何修改maven的JVM啟動(dòng)內(nèi)存參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Java 輸入多行字符串或者多個(gè)int數(shù)值的方法

    Java 輸入多行字符串或者多個(gè)int數(shù)值的方法

    今天小編就為大家分享一篇Java 輸入多行字符串或者多個(gè)int數(shù)值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • springboot整合RabbitMQ 中的 TTL實(shí)例代碼

    springboot整合RabbitMQ 中的 TTL實(shí)例代碼

    TTL 是 RabbitMQ 中一個(gè)消息或者隊(duì)列的屬性,表明一條消息或者該隊(duì)列中的所有消息的最大存活時(shí)間,單位是毫秒,這篇文章主要介紹了springboot整合RabbitMQ 中的 TTL,需要的朋友可以參考下
    2022-09-09
  • netty中的IO、NIO、AIO使用詳解

    netty中的IO、NIO、AIO使用詳解

    這篇文章主要介紹了netty中的IO、NIO、AIO使用詳解,本文會(huì)說(shuō)明各種IO的特點(diǎn)、分別解決了什么樣的問(wèn)題做一個(gè)分析闡述,并結(jié)合Java代碼例子來(lái)輔助理解,像這些的歷史演進(jìn)和詳細(xì)的底層原理網(wǎng)上很多,所以我們只站在應(yīng)用層,使用者的角度去分析,需要的朋友可以參考下
    2023-12-12
  • Java8新特性Stream流中anyMatch和allMatch和noneMatch的區(qū)別解析

    Java8新特性Stream流中anyMatch和allMatch和noneMatch的區(qū)別解析

    這篇文章主要介紹了Java8新特性Stream流中anyMatch和allMatch和noneMatch的區(qū)別解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • Java設(shè)計(jì)模式之單例模式Singleton Pattern詳解

    Java設(shè)計(jì)模式之單例模式Singleton Pattern詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之單例模式Singleton Pattern詳解,一些常用的工具類、線程池、緩存,數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)連接池、賬戶登錄系統(tǒng)、配置文件等程序中可能只允許我們創(chuàng)建一個(gè)對(duì)象,這就需要單例模式,需要的朋友可以參考下
    2023-12-12
  • SWT(JFace) 文本編輯器 實(shí)現(xiàn)代碼

    SWT(JFace) 文本編輯器 實(shí)現(xiàn)代碼

    SWT(JFace) 文本編輯器 實(shí)現(xiàn)代碼
    2009-06-06
  • springboot中使用@NotNull注解無(wú)效解決方法

    springboot中使用@NotNull注解無(wú)效解決方法

    這篇文章主要給大家介紹了關(guān)于springboot中使用@NotNull注解無(wú)效的解決方法,進(jìn)行參數(shù)校驗(yàn)的時(shí)候,加了@NotNull注解,@Validated注解和@Valid注解,但是參數(shù)校驗(yàn)的時(shí)候不生效,需要的朋友可以參考下
    2023-08-08
  • spring boot使用thymeleaf為模板的基本步驟介紹

    spring boot使用thymeleaf為模板的基本步驟介紹

    Spring Boot項(xiàng)目的默認(rèn)模板引擎是Thymeleaf,這沒(méi)什么好說(shuō)的,個(gè)人覺(jué)得也非常好,下面這篇文章主要給大家介紹了關(guān)于spring boot使用thymeleaf為模板的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01

最新評(píng)論

固原市| 惠来县| 集贤县| 荥经县| 本溪| 焦作市| 甘泉县| 巴青县| 漾濞| 博乐市| 淳化县| 丰原市| 依兰县| 古交市| 乡宁县| 棋牌| 永川市| 通城县| 新泰市| 沛县| 任丘市| 体育| 静海县| 玉龙| 北海市| 达孜县| 德庆县| 福州市| 库伦旗| 兰州市| 衡阳县| 托克托县| 阿图什市| 德庆县| 新昌县| 平昌县| 清河县| 商水县| 会宁县| 永春县| 安岳县|