当前位置:网站首页>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: 25000
1.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 )
边栏推荐
- pkg打包node工程(express)
- Apple MDM Bypass 免越狱绕过MDM配置锁 免费
- Taobao seo training video course [22 lectures]
- 上海域格ASR CAT1 4g模块2路保活低功耗4G应用
- How popular are FB and WhatsApp mass messages in 2022?
- 解决ValueError: Iterable over raw text documents expected, string object received.
- CSI以及本地盘的相关实现记录
- V4L2 驱动层分析
- Small ball playing
- YYGH-BUG-03
猜你喜欢
Use of JDBC
自定义 cube-ui 弹出框dialog支持多个且多种类型的input框
Mysql-16-subquery
How to add live chat in your Shopify store?
A full set of excellent SEO tutorials worth 300 yuan [159 lessons]
Apple MDM Bypass 免越狱绕过MDM配置锁 免费
原动力×云原生正发声 降本增效大讲堂
Video tutorial on website operation to achieve SEO operation [21 lectures]
YYGH-7-用户管理
YYGH-BUG-03
随机推荐
Qtcanpool q05: no border
YYGH-BUG-03
PKG package node project (express)
Mosaic data enhanced mosaic
Valueerror: iterative over raw text documents expected, string object received
qtcanpool 知 07:Ribbon
mac下安装多个版本php并且进行管理
mysql常用函数
Jenkins继续集成2
使用pytorch和tensorflow计算分类模型的混淆矩阵
How popular are FB and WhatsApp mass messages in 2022?
5G网络整体架构
Apple MDM Bypass 免越狱绕过MDM配置锁 免费
Qtcanpool knowledge 07:ribbon
YYGH-8-预约挂号
高质量国产立体声编解码器CJC8988,Pin to Pin替代WM8988
数据中台:AI中台的实施与总结
使用SQL select count distinct查询语句统计数据库中某个字段的唯一值总数量
函数栈帧的创建和销毁
Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException:异常解决