web-dev-qa-db-fra.com

Comment puis-je établir une connexion navigateur à navigateur (peer to peer)?

Comment puis-je écrire un site Web en utilisant HTML5 , [~ # ~] css [~ # ~] et JavaScript côté client qui permettra connexion tcp/ip directe entre les navigateurs clients une fois la page chargée.

Je dois le faire pour réduire la latence, car le site exigera que l'entrée de l'un des utilisateurs soit transmise à l'autre utilisateur dès que possible, donc l'envoi de données du client A au serveur puis au client B n'est pas une bonne chose option.

J'ai lu les articles précédents sur ce sujet mais il n'y avait pas de solution de travail/exemples disponibles que je pouvais trouver. D'après ce que j'ai lu, la connexion directe entre les clients peut être établie à l'aide de plugins comme Silverlight, Java ou Flash.

Existe-t-il une solution qui ne nécessiterait pas de plugins? Je souhaite utiliser uniquement JavaScript.

70

Ici sur Stackoverflow sont plusieurs sujets sur les connexions P2P dans les navigateurs:

  1. HTML5 permettra-t-il aux applications Web d'établir des connexions HTTP d'égal à égal?
  2. Quelles techniques sont disponibles pour faire du P2P dans le navigateur?
  3. HTML5 prend-il en charge le peer-to-peer (et pas seulement les WebSockets)
  4. Les Websockets HTML5 peuvent-ils connecter 2 clients (navigateurs) directement sans utiliser de serveur (P2P)
  5. Est-il possible de créer des connexions peer-to-peer dans un navigateur Web?
  6. Les websockets permettent-ils la communication p2p (navigateur à navigateur)?
  7. HTML 5 possibilités de vidéo Peer to Peer?
  8. WebRTC est-il déjà implémenté dans tous les navigateurs?

Comme mentionné dans la plupart des sujets, les deux brouillons de travail HTML5 de 2008 comportaient une section "Connexions point à point":

Depuis le W3C Working Draft 12 février 2009 la section "Connexions poste à poste" a disparu. Mais cette connexion P2P n'a pas disparu. Il est de retour sous le nom de PeerConnection dans les spécifications WebRTC (Real-Time Communications):

Depuis le 31 octobre 2011, le projet de rédaction du W3C est un projet de travail officiel:

La seule implémentation de PeerConnection (basée sur UDP) existe dans le WebKit modifié par les laboratoires Ericsson (mai 2011), qui fonctionne plutôt bien. Certains correctifs sont maintenant dans WebKit (octobre 2011 - voir les mises à jour ci-dessous!):

De plus, l'initiative WebRTC est un projet de Google, Mozilla et Opera. Ainsi, ils poursuivent la spécification sur PeerConnection:

Probablement Chrome (utilise WebKit) sera le premier navigateur majeur prenant en charge WebRTC avec PeerConnection:

Depuis le 18 janvier 2012, Chrome prend également en charge WebRTC . Il peut être utilisé dans le canal Dev (Windows, OSX, Linux) et la version Canary (Windows et OSX) par l'activer sous chrome://flags . Il ne prend en charge que MediaStream comme la vidéo et l'audio et peut être testé avec plusieurs Démos . Le transfert de données d'application comme String/ArrayBuffer/... n'est pas pris en charge jusqu'à présent.

Depuis 16 mars 2012, l'ébauche de l'éditeur WebRTC sépare un "API de données d'égal à égal" pour envoyer et recevoir des données d'application génériques (String, ArrayBuffer et Blob). Chromium veut bientôt implémenter l'API Data (10 avril 2012).

Le 3 avril, Mozilla a également publié un premier exemple de travail sur WebRTC pour Firefox .

DataChannel est prévu pour la version 25 de Chrome, derrière un drapeau, en attendant il peut être testé dans Firefox Nightly/Aurora (12 décembre 2012):

2018: DataChannels est encore expérimental, mais disponible dans les versions actuelles de Chrome et Firefox:

117
Dennis

Je vais devoir vous décevoir - ce n'est actuellement pas possible avec seulement JavaScript. Les Websockets (et Socket.IO) permettent une connexion de type socket entre le client et le serveur, mais pas entre les clients. Votre option est un plugin - que ce soit Flash, Silverlight, Java ou sur mesure.

Ce que vous pouvez faire, c'est utiliser socket.io et l'émuler en écrivant un simple serveur proxy.

7
Emil Ivanov

Je voudrais attirer votre attention sur le fait que la plupart des utilisateurs sont aujourd'hui derrière NAT ou pare-feu, et cela signifie que vous ne pouvez pas facilement établir une connexion entrante avec l'ordinateur de l'utilisateur. Donc, votre idée serait (si possible) ne fonctionne que dans certains cas et apportera une complexité supplémentaire à votre solution. Un système client-serveur avec une connexion éventuellement persistante (utilisant websockets ou socket.io) est une meilleure option.