91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot+netty-socketio如何實現服務器端消息推送

發布時間:2021-03-17 14:12:41 來源:億速云 閱讀:971 作者:小新 欄目:開發技術

這篇文章主要介紹SpringBoot+netty-socketio如何實現服務器端消息推送,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

首先:因為工作需要,需要對接socket.io框架對接,所以目前只能使用netty-socketio。websocket是不支持對接socket.io框架的。

netty-socketio顧名思義他是一個底層基于netty'實現的socket。

在springboot項目中的集成,請看下面的代碼

maven依賴

<dependency>
 <groupId>com.corundumstudio.socketio</groupId>
 <artifactId>netty-socketio</artifactId>
 <version>1.7.11</version>
</dependency>

 下面就是代碼了

首先是配置參數

#socketio配置
socketio:
 host: localhost
 port: 9099
 # 設置最大每幀處理數據的長度,防止他人利用大數據來攻擊服務器
 maxFramePayloadLength: 1048576
 # 設置http交互最大內容長度
 maxHttpContentLength: 1048576
 # socket連接數大小(如只監聽一個端口boss線程組為1即可)
 bossCount: 1
 workCount: 100
 allowCustomRequests: true
 # 協議升級超時時間(毫秒),默認10秒。HTTP握手升級為ws協議超時時間
 upgradeTimeout: 1000000
 # Ping消息超時時間(毫秒),默認60秒,這個時間間隔內沒有接收到心跳消息就會發送超時事件
 pingTimeout: 6000000
 # Ping消息間隔(毫秒),默認25秒。客戶端向服務器發送一條心跳消息間隔
 pingInterval: 25000

上面的注釋寫的很清楚。下面是config代碼

import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketConfig;
import com.corundumstudio.socketio.SocketIOServer;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * kcm
 */
@Component
public class PushServer implements InitializingBean {

  @Autowired
  private EventListenner eventListenner;

  @Value("${socketio.port}")
  private int serverPort;

  @Value("${socketio.host}")
  private String serverHost;

  @Value("${socketio.bossCount}")
  private int bossCount;

  @Value("${socketio.workCount}")
  private int workCount;

  @Value("${socketio.allowCustomRequests}")
  private boolean allowCustomRequests;

  @Value("${socketio.upgradeTimeout}")
  private int upgradeTimeout;

  @Value("${socketio.pingTimeout}")
  private int pingTimeout;

  @Value("${socketio.pingInterval}")
  private int pingInterval;

  @Override
  public void afterPropertiesSet() throws Exception {
    Configuration config = new Configuration();
    config.setPort(serverPort);
    config.setHostname(serverHost);
    config.setBossThreads(bossCount);
    config.setWorkerThreads(workCount);
    config.setAllowCustomRequests(allowCustomRequests);
    config.setUpgradeTimeout(upgradeTimeout);
    config.setPingTimeout(pingTimeout);
    config.setPingInterval(pingInterval);

    SocketConfig socketConfig = new SocketConfig();
    socketConfig.setReuseAddress(true);
    socketConfig.setTcpNoDelay(true);
    socketConfig.setSoLinger(0);
    config.setSocketConfig(socketConfig);

    SocketIOServer server = new SocketIOServer(config);
    server.addListeners(eventListenner);
    server.start();
    System.out.println("啟動正常");
  }
}

在就是監聽代碼

import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.annotation.OnConnect;
import com.corundumstudio.socketio.annotation.OnDisconnect;
import com.corundumstudio.socketio.annotation.OnEvent;
import org.apache.commons.lang3.StringUtils;
import org.bangying.auth.JwtSupport;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.UUID;

@Component
public class EventListenner {
  @Resource
  private ClientCache clientCache;

  @Resource
  private JwtSupport jwtSupport;

  /**
   * 客戶端連接
   *
   * @param client
   */
  @OnConnect
  public void onConnect(SocketIOClient client) {
    String userId = client.getHandshakeData().getSingleUrlParam("userId");
//    userId = jwtSupport.getApplicationUser().getId().toString();
//    userId = "8";
    UUID sessionId = client.getSessionId();
    clientCache.saveClient(userId, sessionId, client);
    System.out.println("建立連接");
  }

  /**
   * 客戶端斷開
   *
   * @param client
   */
  @OnDisconnect
  public void onDisconnect(SocketIOClient client) {
    String userId = client.getHandshakeData().getSingleUrlParam("userId");
    if (StringUtils.isNotBlank(userId)) {
      clientCache.deleteSessionClient(userId, client.getSessionId());
      System.out.println("關閉連接");
    }
  }

  //消息接收入口,當接收到消息后,查找發送目標客戶端,并且向該客戶端發送消息,且給自己發送消息
  // 暫未使用
  @OnEvent("messageevent")
  public void onEvent(SocketIOClient client, AckRequest request) {
  }
}

本地緩存信息

import com.corundumstudio.socketio.SocketIOClient;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

/**
 * kcm
 */
@Component
public class ClientCache {

  //本地緩存
  private static Map<String, HashMap<UUID, SocketIOClient>> concurrentHashMap=new ConcurrentHashMap<>();
  /**
   * 存入本地緩存
   * @param userId 用戶ID
   * @param sessionId 頁面sessionID
   * @param socketIOClient 頁面對應的通道連接信息
   */
  public void saveClient(String userId, UUID sessionId,SocketIOClient socketIOClient){
    if(StringUtils.isNotBlank(userId)){
      HashMap<UUID, SocketIOClient> sessionIdClientCache=concurrentHashMap.get(userId);
      if(sessionIdClientCache==null){
        sessionIdClientCache = new HashMap<>();
      }
      sessionIdClientCache.put(sessionId,socketIOClient);
      concurrentHashMap.put(userId,sessionIdClientCache);
    }
  }
  /**
   * 根據用戶ID獲取所有通道信息
   * @param userId
   * @return
   */
  public HashMap<UUID, SocketIOClient> getUserClient(String userId){
    return concurrentHashMap.get(userId);
  }
  /**
   * 根據用戶ID及頁面sessionID刪除頁面鏈接信息
   * @param userId
   * @param sessionId
   */
  public void deleteSessionClient(String userId,UUID sessionId){
    concurrentHashMap.get(userId).remove(sessionId);
  }
}

下面是存儲客戶端連接信息

import com.corundumstudio.socketio.SocketIOClient;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

/**
 * kcm
 */
@Component
public class ClientCache {

  //本地緩存
  private static Map<String, HashMap<UUID, SocketIOClient>> concurrentHashMap=new ConcurrentHashMap<>();
  /**
   * 存入本地緩存
   * @param userId 用戶ID
   * @param sessionId 頁面sessionID
   * @param socketIOClient 頁面對應的通道連接信息
   */
  public void saveClient(String userId, UUID sessionId,SocketIOClient socketIOClient){
    if(StringUtils.isNotBlank(userId)){
      HashMap<UUID, SocketIOClient> sessionIdClientCache=concurrentHashMap.get(userId);
      if(sessionIdClientCache==null){
        sessionIdClientCache = new HashMap<>();
      }
      sessionIdClientCache.put(sessionId,socketIOClient);
      concurrentHashMap.put(userId,sessionIdClientCache);
    }
  }
  /**
   * 根據用戶ID獲取所有通道信息
   * @param userId
   * @return
   */
  public HashMap<UUID, SocketIOClient> getUserClient(String userId){
    return concurrentHashMap.get(userId);
  }
  /**
   * 根據用戶ID及頁面sessionID刪除頁面鏈接信息
   * @param userId
   * @param sessionId
   */
  public void deleteSessionClient(String userId,UUID sessionId){
    concurrentHashMap.get(userId).remove(sessionId);
  }
}

控制層推送方法

@RestController
@RequestMapping("/push")
public class PushController {
  @Resource
  private ClientCache clientCache;

  @Autowired
  private JwtSupport jwtSupport;

  @GetMapping("/message")
  public String pushTuUser(@Param("id") String id){
    Integer userId = jwtSupport.getApplicationUser().getId();
    HashMap<UUID, SocketIOClient> userClient = clientCache.getUserClient(String.valueOf(userId));
    userClient.forEach((uuid, socketIOClient) -> {
      //向客戶端推送消息
      socketIOClient.sendEvent("chatevent","服務端推送消息");
    });
    return "success";
  }
}

以上是“SpringBoot+netty-socketio如何實現服務器端消息推送”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

漯河市| 南投市| 兖州市| 扶风县| 得荣县| 鄄城县| 松江区| 聂荣县| 海盐县| 民勤县| 和龙市| 梁平县| 林芝县| 交城县| 望奎县| 罗山县| 临潭县| 林西县| 泗阳县| 六安市| 九江市| 永安市| 济南市| 铁力市| 通化市| 瓦房店市| 西城区| 皋兰县| 辛集市| 镇原县| 林周县| 荆门市| 泉州市| 固原市| 慈溪市| 白朗县| 吕梁市| 若尔盖县| 洞头县| 平江县| 班戈县|