web-dev-qa-db-fra.com

comment fonctionne socket.io?

J'utilise socket.io et sa configuration a été rapide (grâce aux exemples sur leur page d'utilisation), mais j'aimerais en savoir plus sur ce qui se passe exactement sous les couvertures et quelle est la technologie qui le fait fonctionner.

quelle est la mécanique exacte de socket.io?

est-ce sur le port 80 ou sur un port séparé?

reste-t-il vraiment ouvert ou cette partie est-elle simulée?

existe-t-il un moyen de profiler chaque événement de socket? (un peu comme utiliser fiddler pour voir ce qui se passe dans les appels ajax)

63
Sonic Soul

Pour le débogage, vous voudrez peut-être essayer Theseus .

Voici un bref aperçu du socket.io SPEC :

Socket.IO vise à apporter une API de type WebSocket à de nombreux navigateurs et appareils, avec des fonctionnalités spécifiques pour aider à la création d'applications et de jeux en temps réel.

  • Prise en charge de plusieurs transports (anciens agents utilisateurs, navigateurs mobiles, etc.).
  • Plusieurs sockets sous la même connexion (espaces de noms).
  • Détection de déconnexion par battements cardiaques.
  • Remerciements facultatifs.
  • Prise en charge de la reconnexion avec mise en mémoire tampon (idéale pour les appareils mobiles ou les mauvais réseaux)
  • Protocole léger qui se trouve au-dessus de HTTP.

Anatomie d'une prise Socket.IO

Un client Socket.IO décide d'abord d'un transport à utiliser pour se connecter.

L'état du socket Socket.IO peut être disconnected, disconnecting, connected et connecting.

La connexion de transport peut être closed, closing, open et opening.

Une simple négociation HTTP a lieu au début d'une connexion Socket.IO. Si la poignée de main réussit, le client reçoit:

  • Un identifiant de session qui sera donné pour que le transport ouvre les connexions.
  • Nombre de secondes pendant lesquelles un battement de cœur est attendu (heartbeat timeout)
  • Un certain nombre de secondes après la fermeture de la connexion de transport lorsque le socket est considéré comme déconnecté si la connexion de transport n'est pas rouverte (close timeout).

À ce stade, la prise est considérée comme connectée et le transport est signalé pour ouvrir la connexion.

Si la connexion de transport est fermée, les deux extrémités doivent mettre en mémoire tampon les messages, puis les encadrer de manière appropriée pour qu'ils soient envoyés en tant que lot lorsque la connexion reprend.

Si la connexion n'est pas reprise dans le délai négocié, le socket est considéré comme déconnecté. À ce stade, le client peut décider de reconnecter le socket, ce qui implique une nouvelle prise de contact.

Si vous avez besoin de plus de détails, vous pouvez lire le reste de la spécification ici

38
JAM

La publication de JAM résume bien ce qu'est socket.io ; J'aimerais répondre spécifiquement à certaines de vos autres questions.

  • Socket.io s'attache à une instance de http.Server Et y ajoute des gestionnaires. Il n'écoute pas seul un port réseau; il ajoute simplement des gestionnaires spécifiques à socket.io à un serveur HTTP existant. (Cependant, si vous appelez io.listen() avec un numéro, il crée en interne un nouveau serveur HTTP qui écoute le port spécifié et s'y attache.)

  • Il reste vraiment ouvert s'il utilise le transport WebSockets . Il comprend également des mécanismes de secours qui utilisent les requêtes ajax d'interrogation traditionnelles (longues). La réponse dépend donc des API prises en charge par le navigateur. (Vous pouvez éventuellement configurer les solutions de secours que vous souhaitez utiliser, le cas échéant.)

  • Fiddler prend désormais en charge les Websockets, tout comme les outils de développement de Chrome:

enter image description here

32
josh3736