150 votes

Envoi d'une trame ping/pong websocket à partir du navigateur

Je continue à lire sur les messages ping/pong dans les websockets pour maintenir la connexion en vie, mais je ne suis pas sûr de ce qu'ils sont. S'agit-il d'un type de trame distinct ? (Je ne vois aucune méthode sur un objet javascript WebSocket dans chrome liée au ping-pong). Ou est-ce simplement un modèle de conception (par exemple, j'envoie littéralement "ping" ou toute autre chaîne au serveur et il répond). Le ping-pong est-il lié aux cadres de continuation ?

La raison de ma question est que j'utilise un framework python qui fonctionne derrière Mongrel2, et je me demande s'il existe un moyen d'envoyer à Mongrel2 un message ping/pong spécifique qui lui indiquerait de maintenir la connexion en vie sans que mon application python ait à s'en soucier. C'est un peu comme avoir une méthode HTTP séparée pour cela, je suppose. Et j'imagine qu'une trame de message ping/pong dédiée pourrait être plus simple (moins de charge sur le serveur et le réseau) que la chaîne "ping", bien que cela n'ait probablement pas trop d'importance.

EDIT : Je viens de regarder RFC 6455 et il semble que Ping et Pong sont définitivement des types de trames de contrôle avec leurs propres opcodes. Alors comment envoyer un cadre Ping à partir de javascript dans Chrome ?

0 votes

Juste un ping du serveur. Tout le monde est au courant du problème de réseau sur les ports non standard, donc ils commencent à faire des ping à intervalles réguliers et courts. Je suppose que vous pouvez envoyer un ping à un serveur mal écrit, mais il ne serait pas très intelligent de faire quelque chose de sensible avec eux.

0 votes

1 votes

@user1382306 ping du serveur d'abord va utiliser la batterie de l'appareil mobile très rapidement. Le ping depuis le client peut économiser la batterie de l'appareil.

136voto

kanaka Points 23143

Il n'existe pas d'API Javascript pour envoyer des trames ping ou recevoir des trames pong. Cette fonction est prise en charge par votre navigateur, ou non. Il n'existe pas non plus d'API pour activer, configurer ou détecter si le navigateur prend en charge et utilise les cadres ping/pong. Il y avait discussion sur la création d'une API Javascript ping/pong pour ça. Il est possible que les pings soient configurables/détectables à l'avenir, mais il est peu probable que Javascript soit capable d'envoyer et de recevoir directement des trames ping/pong.

Toutefois, si vous contrôlez à la fois le code du client et celui du serveur, vous pouvez facilement ajouter la prise en charge du ping/pong à un niveau supérieur. Vous aurez besoin d'une sorte d'en-tête/métadonnées de type de message dans votre message si vous ne l'avez pas déjà, mais c'est assez simple. À moins que vous ne prévoyiez d'envoyer des pings des centaines de fois par seconde ou que vous ayez des milliers de clients simultanés, les frais généraux seront assez minimes pour le faire vous-même.

1 votes

@bigmugcup Le lien est mort

0 votes

Est-il possible de créer par programme une trame binaire qui contient la trame "ping" ?

0 votes

C'est ainsi que le ws La librairie Websocket le fait : github.com/websockets/ws/blob/

16voto

moka Points 6143

Le ping est destiné à être envoyé uniquement du serveur au client, et le navigateur doit répondre dès que possible avec l'OpCode Pong, automatiquement. Vous n'avez donc pas à vous en préoccuper à un niveau supérieur.

Bien que tous les navigateurs ne supportent pas la norme comme ils sont censés le faire, ils peuvent avoir des différences dans la mise en œuvre de ce mécanisme, et cela peut même signifier qu'il n'y a pas de fonctionnalité de réponse Pong. Mais personnellement, j'utilise Ping / Pong, et je n'ai jamais vu de client qui n'implémente pas ce type d'OpCode et de réponse automatique sur une implémentation de bas niveau côté client.

0 votes

Intéressant, il est plus logique que ce soit le serveur qui lance les appels. Quel serveur web utilisez-vous ?

0 votes

J'utilise ma propre implémentation du protocole WebSockets sur .Net / Mono pour mon propre plaisir. Les sources peuvent être trouvées ici github.com/Maksims/gh12-server

1 votes

Lors de mes tests, j'ai trouvé des navigateurs courants qui ne supportent pas le ping/pong ; je ne me souviens plus lesquels.

4voto

xgqfrms Points 2718

Une solution possible en js

Dans le cas où l'initiative du serveur WebSocket déconnecte l'utilisateur de l'ordinateur. ws après quelques minutes, aucun message n'a été envoyé entre le serveur et le client.

  1. l'initiative côté client envoie un ping pour rester en vie en utilisant le message keepAlive fonction

  2. l'extrémité du serveur ignorera le paramètre personnalisé ping et répond à un message personnalisé pong message

    let timerId = 0;

    function keepAlive(timeout = 20000) { if (webSocket.readyState == webSocket.OPEN) {
    webSocket.send('');
    }
    timerId = setTimeout(keepAlive, timeout);
    }

    function cancelKeepAlive() {
    if (timerId) {
    clearTimeout(timerId);
    }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X