亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

springboot整合websocket最基礎(chǔ)入門使用教程詳解

 更新時(shí)間:2021年03月24日 14:45:22   作者:小哇666  
這篇文章主要介紹了springboot整合websocket最基礎(chǔ)入門使用教程詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

項(xiàng)目最終的文件結(jié)構(gòu)


1 添加maven依賴

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.12</version>
</dependency>

2 編寫配置類 WebSocketConfig

package cn.huawei.socket_test_1.config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
 
@Component
public class WebSocketConfig {
 
  /**
   * ServerEndpointExporter 作用
   *
   * 這個(gè)Bean會(huì)自動(dòng)注冊(cè)使用@ServerEndpoint注解聲明的websocket endpoint
   *
   * @return
   */
  @Bean
  public ServerEndpointExporter serverEndpointExporter() {
    return new ServerEndpointExporter();
  }
}

3 編寫核心業(yè)務(wù)類 WebSocket

package cn.huawei.socket_test_1.websock;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
 
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.ConcurrentHashMap;
 
/**
 * @ServerEndpoint 注解的作用
 *
 * @ServerEndpoint 注解是一個(gè)類層次的注解,它的功能主要是將目前的類定義成一個(gè)websocket服務(wù)器端,
 * 注解的值將被用于監(jiān)聽用戶連接的終端訪問URL地址,客戶端可以通過(guò)這個(gè)URL來(lái)連接到WebSocket服務(wù)器端
 */
 
@Slf4j
@Component
@ServerEndpoint("/websocket/{name}")
public class WebSocket {
 
  /**
   * 與某個(gè)客戶端的連接對(duì)話,需要通過(guò)它來(lái)給客戶端發(fā)送消息
   */
  private Session session;
 
  /**
   * 標(biāo)識(shí)當(dāng)前連接客戶端的用戶名
   */
  private String name;
 
  /**
   * 用于存所有的連接服務(wù)的客戶端,這個(gè)對(duì)象存儲(chǔ)是安全的
   * 注意這里的kv,設(shè)計(jì)的很巧妙,v剛好是本類 WebSocket (用來(lái)存放每個(gè)客戶端對(duì)應(yīng)的MyWebSocket對(duì)象)
   */
  private static ConcurrentHashMap<String,WebSocket> webSocketSet = new ConcurrentHashMap<>();
 
 
  /**
   * 連接建立成功調(diào)用的方法
   * session為與某個(gè)客戶端的連接會(huì)話,需要通過(guò)它來(lái)給客戶端發(fā)送數(shù)據(jù)
   */
  @OnOpen
  public void OnOpen(Session session, @PathParam(value = "name") String name){
    log.info("----------------------------------");
    this.session = session;
    this.name = name;
    // name是用來(lái)表示唯一客戶端,如果需要指定發(fā)送,需要指定發(fā)送通過(guò)name來(lái)區(qū)分
    webSocketSet.put(name,this);
    log.info("[WebSocket] 連接成功,當(dāng)前連接人數(shù)為:={}",webSocketSet.size());
    log.info("----------------------------------");
    log.info("");
 
    GroupSending(name+" 來(lái)了");
  }
 
  /**
   * 連接關(guān)閉調(diào)用的方法
   */
  @OnClose
  public void OnClose(){
    webSocketSet.remove(this.name);
    log.info("[WebSocket] 退出成功,當(dāng)前連接人數(shù)為:={}",webSocketSet.size());
 
    GroupSending(name+" 走了");
  }
 
  /**
   * 收到客戶端消息后調(diào)用的方法
   */
  @OnMessage
  public void OnMessage(String message_str){
    log.info("[WebSocket] 收到消息:{}",message_str);
    //判斷是否需要指定發(fā)送,具體規(guī)則自定義
    //message_str的格式 TOUSER:user2;message:aaaaaaaaaaaaaaaaaa;
    if(message_str.indexOf("TOUSER") == 0){
      //取出 name和message的值
      String[] split = message_str.split(";");
      String[] split1 = split[0].split(":");
      String[] split2 = split[1].split(":");
      String name = split1[1];
      String message = split2[1];
      //指定發(fā)送
      AppointSending(name,message);
    }else{
      //群發(fā)
      GroupSending(message_str);
    }
  }
 
  /**
   * 發(fā)生錯(cuò)誤時(shí)調(diào)用
   * @param session
   * @param error
   */
  @OnError
  public void onError(Session session, Throwable error){
    log.info("發(fā)生錯(cuò)誤");
    error.printStackTrace();
  }
 
  /**
   * 群發(fā)
   * @param message
   */
  public void GroupSending(String message){
    for (String name : webSocketSet.keySet()){
      try {
        webSocketSet.get(name).session.getBasicRemote().sendText(message);
      }catch (Exception e){
        e.printStackTrace();
      }
    }
  }
 
  /**
   * 指定發(fā)送
   * @param name
   * @param message
   */
  public void AppointSending(String name,String message){
    try {
      webSocketSet.get(name).session.getBasicRemote().sendText(message);
    }catch (Exception e){
      e.printStackTrace();
    }
  }
}

4 因前端不熟悉,所以使用 http://coolaf.com/tool/chattest 在線測(cè)試
因代碼中 @ServerEndpoint("/websocket/{name}") 是這樣定義的,所以 通過(guò)下面的方式連接上去,測(cè)試群發(fā)和指定發(fā)送

因java代碼中這樣定義的消息,可以指定發(fā)送某個(gè)人,測(cè)試

到此這篇關(guān)于springboot整合websocket最基礎(chǔ)入門使用教程詳解的文章就介紹到這了,更多相關(guān)springboot整合websocket入門內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java自定義線程模型處理方法分享

    java自定義線程模型處理方法分享

    本文給大家總結(jié)分享了下個(gè)人關(guān)于java處理自定義線程模型的一些經(jīng)驗(yàn)和處理方法,有需要的小伙伴可以參考下
    2016-08-08
  • SpringBoot淺析安全管理之Spring Security配置

    SpringBoot淺析安全管理之Spring Security配置

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會(huì)發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會(huì)出現(xiàn)問題,這篇文章主要介紹了SpringBoot安全管理Spring Security基本配置
    2022-08-08
  • 關(guān)于@RequestBody和@RequestParam注解的使用詳解

    關(guān)于@RequestBody和@RequestParam注解的使用詳解

    這篇文章主要介紹了關(guān)于@RequestBody和@RequestParam注解的使用詳解,本文十分具有參考意義,希望可以幫助到你,如果有錯(cuò)誤的地方還望不吝賜教
    2023-03-03
  • 淺談SpringSecurity基本原理

    淺談SpringSecurity基本原理

    今天帶大家了解一下SpringSecurity的基本原理,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Spring?boot?RedisTemplate?序列化服務(wù)化配置方式

    Spring?boot?RedisTemplate?序列化服務(wù)化配置方式

    這篇文章主要介紹了Springboot?RedisTemplate序列化服務(wù)化配置方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Springboot整合mybatisplus時(shí),使用條件構(gòu)造器排序報(bào)錯(cuò)問題及解決

    Springboot整合mybatisplus時(shí),使用條件構(gòu)造器排序報(bào)錯(cuò)問題及解決

    這篇文章主要介紹了Springboot整合mybatisplus時(shí),使用條件構(gòu)造器排序報(bào)錯(cuò)問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • java二維數(shù)組實(shí)現(xiàn)推箱子小游戲

    java二維數(shù)組實(shí)現(xiàn)推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了java二維數(shù)組實(shí)現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • SpringBoot熱部署啟動(dòng)關(guān)閉流程詳解

    SpringBoot熱部署啟動(dòng)關(guān)閉流程詳解

    Spring?Boot啟動(dòng)熱部署是一種技術(shù),它能讓開發(fā)者在不重啟應(yīng)用程序的情況下實(shí)時(shí)更新代碼。這樣可以提高開發(fā)效率,避免頻繁重啟應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-04-04
  • Spring Boot實(shí)現(xiàn)郵件注冊(cè)功能示例代碼

    Spring Boot實(shí)現(xiàn)郵件注冊(cè)功能示例代碼

    本篇文章主要介紹了Spring Boot實(shí)現(xiàn)郵件注冊(cè)功能示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Centos中yum方式安裝java的實(shí)現(xiàn)示例

    Centos中yum方式安裝java的實(shí)現(xiàn)示例

    這篇文章主要介紹了Centos中yum方式安裝java的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評(píng)論