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

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 編寫(xiě)配置類 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 編寫(xiě)核心業(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)聽(tīng)用戶連接的終端訪問(wè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)文章

最新評(píng)論

海宁市| 崇文区| 双柏县| 寿宁县| 冕宁县| 普安县| 历史| 沁源县| 镇赉县| 呼图壁县| 金塔县| 建水县| 崇仁县| 兴和县| 玉屏| 若羌县| 江达县| 福建省| 象州县| 道孚县| 开封县| 龙游县| 普陀区| 涿州市| 田林县| 德昌县| 偃师市| 蓬溪县| 文登市| 南康市| 蓝山县| 华阴市| 德兴市| 武穴市| 城口县| 于田县| 额济纳旗| 饶河县| 麦盖提县| 阿拉善右旗| 紫阳县|