当前位置:网站首页>Socket. Io long Connection Push, version Control, Real - Time Active user volume Statistics
Socket. Io long Connection Push, version Control, Real - Time Active user volume Statistics
2022-06-28 05:57:00 【Linguiste abiotique】
Un.、Description du scénario:
Microservice construit une plate - forme de contrôle de version:Vérification en temps réel de chaque application et des utilisateurs en ligne à chaque extrémité de la plate - forme sous l'application,Point pour spécifier les mises à jour logicielles sous chaque plate - forme.Il y a beaucoup d'outils de connexion longue sur le marché,Je choisis ici.socke.io,Parce que la concurrence est testée par des professionnels qui se concentrent sur les plateformes croiséesios、Android、webEt le support dans toutes les langues est assez complet.
2.、Introduction au modèle

Trois、Réalisation de base
1、springbootIntégrationsocket.ioLongue connexion
1.1、pomIntroduire des dépendances
<!-- Longue connexion -->
<dependency>
<groupId>com.corundumstudio.socketio</groupId>
<artifactId>netty-socketio</artifactId>
<version>1.7.19</version>
</dependency>1.2、Initialisation des paramètres de configuration
socketio:
host: localhost
port: 10091
# Définir la longueur maximale des données traitées par image,Empêcher d'autres d'utiliser le Big Data pour attaquer le serveur
maxFramePayloadLength: 1048576
# ParamètreshttpLongueur maximale du contenu interactif
maxHttpContentLength: 1048576
# socketNombre de connexions taille(Si vous n'écoutez qu'un seul portbossLe Groupe de thread est1C'est tout.)
bossCount: 1
workCount: 100
allowCustomRequests: true
# Délai de mise à jour du Protocole(MS),Par défaut10Secondes.HTTPPoignée de main mise à jour àwsDélai d'exécution du Protocole
upgradeTimeout: 1000000
# PingMessage timeout(MS),Par défaut60Secondes,Aucun message de battement de cœur n'est reçu dans cet intervalle de temps et un événement de temporisation est envoyé
pingTimeout: 6000000
# PingIntervalle de message(MS),Par défaut25Secondes.Le client envoie un intervalle de battements de cœur au serveur
pingInterval: 250001.3、 Configuration de la classe de démarrage de connexion longue
import com.corundumstudio.socketio.SocketConfig;
import com.corundumstudio.socketio.SocketIONamespace;
import com.corundumstudio.socketio.SocketIOServer;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
/**
* Classe de configuration de démarrage longue connexion
*/
@Configuration
public class SocketIOConfig implements InitializingBean {
@Resource
private SocketIOHandler socketIOHandler;
@Value("${socketio.host}")
private String host;
@Value("${socketio.port}")
private Integer port;
@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;
public SocketIOServer socketIOServer;
@Override
public void afterPropertiesSet() throws Exception {
SocketConfig socketConfig = new SocketConfig();
socketConfig.setReuseAddress(true);
socketConfig.setTcpNoDelay(true);
socketConfig.setSoLinger(0);
com.corundumstudio.socketio.Configuration configuration = new com.corundumstudio.socketio.Configuration();
configuration.setSocketConfig(socketConfig);
// host Le test local peut être réglé à localhostOu cette machineIP,InLinux Le serveur peut être remplacé par un serveur IP
configuration.setHostname(host);
configuration.setPort(port);
// socketNombre de connexions taille(Si vous n'écoutez qu'un seul portbossLe Groupe de thread est1C'est tout.)
configuration.setBossThreads(bossCount);
configuration.setWorkerThreads(workCount);
configuration.setAllowCustomRequests(allowCustomRequests);
// Délai de mise à jour du Protocole(MS),Par défaut10Secondes.HTTPPoignée de main mise à jour àwsDélai d'exécution du Protocole
configuration.setUpgradeTimeout(upgradeTimeout);
// PingMessage timeout(MS),Par défaut60Secondes,Aucun message de battement de cœur n'est reçu dans cet intervalle de temps et un événement de temporisation est envoyé
configuration.setPingTimeout(pingTimeout);
// PingIntervalle de message(MS),Par défaut25Secondes.Le client envoie un intervalle de battements de cœur au serveur
configuration.setPingInterval(pingInterval);
socketIOServer = new SocketIOServer(configuration);
//Ajouter un auditeur d'événements
socketIOServer.addListeners(socketIOHandler);
// Après ça, c'est app Appliquer la requête dans le tableau Liste des applicationsfor Boucle pour enregistrer l'espace de noms
SocketIONamespace namespace = socketIOServer.addNamespace("/chat");
SocketIONamespace namespace1 = socketIOServer.addNamespace("/ Application 1 id");
SocketIONamespace namespace2 = socketIOServer.addNamespace("/ Application 2 id");
SocketIONamespace namespace3 = socketIOServer.addNamespace("/ Application 3 id");
SocketIONamespace namespace4 = socketIOServer.addNamespace("/ Application IV id");
//DémarrageSocketIOServer
socketIOServer.start();
System.out.println("SocketIODémarrage terminé.");
}
}1.4、 Classe d'enregistrement d'événements de connexion longue
import com.corundumstudio.socketio.HandshakeData;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.annotation.OnConnect;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
/**
* Surveillance des événements de connexion longue
*/
@Component
@Slf4j
public class SocketIOHandler {
@OnConnect
public void onConnect(SocketIOClient client) {
if (!ObjectUtils.isEmpty(client)) {
HandshakeData handshakeData = client.getHandshakeData();
//Selon la plateformeidInscription Par exemple: Android、ios、java、webAttendez.
String platformId= handshakeData.getSingleUrlParam("platformId");
if (!StringUtils.isEmpty(roomId)) {
client.joinRoom(platformId);
}
}
}
}1.5、 Fournir une interface statistique utilisateur à l'extérieur ( Obtient le nombre total d'utilisateurs de l'application ou le nombre d'utilisateurs d'une plate - forme sous l'application )
import com.corundumstudio.socketio.BroadcastOperations;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIONamespace;
import com.corundumstudio.socketio.SocketIOServer;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Collection;
@RestController
public class Contrler {
@Resource
private SocketIOConfig socketIOConfig;
@GetMapping("/getAllUser")
public String getAllUser(@RequestBody @Validated GetAllUserDO getAllUserDO) {
SocketIOServer socketIOServer = socketIOConfig.socketIOServer;
if (!ObjectUtils.isEmpty(socketIOServer)) {
SocketIONamespace namespace = socketIOServer.getNamespace("/"+getAllUserDO.getAppId());
if (!ObjectUtils.isEmpty(namespace)) {
if (!ObjectUtils.isEmpty(getAllUserDO.getPlatformId())) {
BroadcastOperations roomOperations = namespace.getRoomOperations(getAllUserDO.getPlatformId() + "");
return roomOperations.getClients().size() + "";
}
Collection<SocketIOClient> allClients = namespace.getAllClients();
return allClients.size() + "";
}
}
return "0";
}
}2、JSLe client établit une longue connexion(ios、Android Attendez que chaque plate - forme soit pertinente sdk Plusieurs lignes de code peuvent être intégrées )
<html>
<head>
<meta charset="utf-8"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.0/socket.io.js"></script>
<body>
<h1>Netty-socketio Demo Chat</h1>
<br/>
<div id="console" class="well">
</div>
Nombre total de messages:<div id="msgnum">0</di>
</body>
<script type="text/javascript">
var socket = io.connect('http://localhost:10091/chat?platformId=666');
socket.
socket.on('connect', function() {
output('<span class="connect-msg">Client has connected to the server!</span>');
});
socket.on('disconnect', function() {
output('<span class="disconnect-msg">The client has disconnected!</span>');
});
function sendDisconnect() {
socket.disconnect();
}
</script>
</head>
</html>Quatre、 Le client est connecté au serveur ( Version spécifique push et interaction de données omis )


边栏推荐
- 一看就会 MotionLayout使用的几种方式
- Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException:异常解决
- Mysql-17- create and manage tables
- Data midrange: implementation and summary of AI midrange
- Use of JDBC
- Mysql-16-subquery
- 基于Kotlin+JetPack实现的MVVM框架的示例
- Jenkins持续集成1
- 使用pytorch和tensorflow计算分类模型的混淆矩阵
- pkg打包node工程(express)
猜你喜欢

函数栈帧的创建和销毁

Drop down box for implementation

19 fonctions de perte d'apprentissage profond

How the third-party libraries in cocoapod reference local header files
![RL practice (0) - and the platform xinchou winter season [rule based policy]](/img/dc/10d615c64123475fea180e035095ff.png)
RL practice (0) - and the platform xinchou winter season [rule based policy]

容量调度绝对值配置队列使用与避坑

RL 实践(0)—— 及第平台辛丑年冬赛季【Rule-based policy】

ES9023音频解码芯片的工作原理

At first glance, I can see several methods used by motionlayout

深度學習19種損失函數
随机推荐
Typescript base type
Use of JDBC
函数栈帧的创建和销毁
Drop down box for implementation
Introduction to uicollectionviewdiffabledatasource and nsdiffabledatasourcesnapshot
High quality domestic stereo codec cjc8988, pin to pin replaces wm8988
PS effect understanding record 2 color_ dodge color_ burn
脚本语言和编程语言
Simple handwritten debounce function
数据仓库:DWS层设计原则
cocoapod中的第三方库怎么引用本地头文件
Important basis for ERP software company selection
Openharmony gnawing paper growth plan -- json-rpc
Typescript interface
[MySQL] all query tables contain 20million data -- how to optimize SQL
OpenSCAP 简介
How to add live chat in your Shopify store?
windows上安装redis并永久修改密码,及ssm框架集成redis
什么是WebRTC?
解决ValueError: Iterable over raw text documents expected, string object received.