Jak mogę utworzyć połączenie między przeglądarką (peer to peer)? [Zamknięte]

84

Jak napisać stronę internetową przy użyciu HTML5 , CSS i JavaScript po stronie klienta, która pozwoli na bezpośrednie połączenie tcp / ip między przeglądarkami klienta po załadowaniu strony .

Muszę to zrobić, aby zmniejszyć opóźnienie, ponieważ witryna będzie wymagać, aby dane wejściowe od jednego użytkownika zostały przesłane do drugiego użytkownika tak szybko, jak to możliwe, więc wysyłanie danych z klienta A do serwera, a następnie do klienta B nie jest dobre opcja.

Czytałem poprzednie posty na ten temat, ale nie było dostępnych rozwiązań / przykładów, które mógłbym znaleźć. Z tego co czytałem bezpośrednie połączenie między klientami można nawiązać za pomocą wtyczek takich jak Silverlight, Java czy Flash.

Czy istnieje rozwiązanie, które nie wymagałoby wtyczek? Chciałbym używać tylko JavaScript.

Răzvan Flavius ​​Panda
źródło
3
Połączenie równorzędne WebRTC bez serwera sygnalizacyjnego: blog.printf.net/articles/2013/05/17/ ...
danijar
1
Zobacz także PeerJS , projekt mający pewne zalety w tej dziedzinie, który ma stosunkowo przyzwoitą obsługę przeglądarki .
Boaz
1
Najprostszym sposobem jest użycie połączeń httprelay.io i AJAX. Jest szybki, mniej niż 50 ms.
Jonas

Odpowiedzi:

126

Tutaj w Stackoverflow jest kilka tematów dotyczących połączeń P2P w przeglądarkach:

  1. Czy HTML5 pozwoli aplikacjom internetowym na nawiązywanie połączeń HTTP peer-to-peer?
  2. Jakie techniki są dostępne do wykonywania P2P w przeglądarce?
  3. Czy HTML5 obsługuje Peer-to-Peer (a nie tylko WebSockets)
  4. Czy HTML5 Websockets może łączyć 2 klientów (przeglądarki) bezpośrednio bez użycia serwera (P2P)
  5. Czy możliwe jest tworzenie połączeń peer-to-peer w przeglądarce internetowej?
  6. Czy gniazda sieciowe umożliwiają komunikację p2p (przeglądarka z przeglądarką)?
  7. Możliwości wideo peer to peer w formacie HTML 5?
  8. Czy WebRTC jest już zaimplementowane w jakichś przeglądarkach?

Jak wspomniano w większości tematów, oba robocze robocze wersje robocze HTML5 na rok 2008 miały sekcję „Połączenia peer-to-peer”:

Od wersji roboczej W3C z 12 lutego 2009 r . Sekcja „Połączenia peer-to-peer” zniknęła. Ale to połączenie P2P nie zniknęło. Wraca pod nazwą PeerConnection w ramach specyfikacji WebRTC (Real-Time Communications):

Od 31 października 2011 r. Projekt redaktora W3C jest oficjalnym projektem roboczym:

Jedyna implementacja PeerConnection (oparta na UDP) istnieje w zmodyfikowanym WebKicie przez laboratoria firmy Ericsson (maj 2011), która działa całkiem dobrze. Niektóre poprawki są teraz w WebKit (październik 2011 - zobacz aktualizacje poniżej!):

Dodatkowo inicjatywa WebRTC to projekt Google, Mozilla i Opera. W związku z tym kontynuują specyfikację dotyczącą PeerConnection:

Prawdopodobnie Chrome (wykorzystuje WebKit) będzie pierwszą dużą przeglądarką obsługującą WebRTC z PeerConnection:

Od 18 stycznia 2012 r. Chrome obsługuje również WebRTC . Można go używać w kanale deweloperskim (Windows, OSX, Linux) i kompilacji Canary (Windows i OSX) , włączając ją w sekcjichrome://flags . Obsługuje tylko MediaStreamwideo i audio i można go przetestować z kilkoma wersjami demonstracyjnymi . Przesyłanie danych aplikacji, takich jak String/ ArrayBuffer/ ..., nie jest do tej pory obsługiwane.

Od 16 marca 2012 roku, sporządzania WebRTC redakcji oddziela „peer-to-peer API danych” do wysyłania i odbierania danych aplikacji (generyczne String, ArrayBufferi Blob). Chromium chce wkrótce wdrożyć Data API (10 kwietnia 2012).

3 kwietnia Mozilla opublikowała również pierwszy działający przykład w WebRTC dla przeglądarki Firefox .

DataChannel jest planowany dla wersji 25 Chrome, za flagą, tymczasem można go przetestować w Firefoksie Nightly / Aurora (12 grudnia 2012):

2018: DataChannels są nadal w fazie eksperymentalnej, ale są dostępne w aktualnych wersjach Chrome i Firefox:

Dennis
źródło
11
Jest rok 2014, czy możesz zaktualizować swój doskonały post o ostatnie postępy?
myroslav
1
@myroslav webrtc.org/interop to dobre miejsce do rozpoczęcia. Obecnie Firefox, Chrome i Opera zapewniają pełne wsparcie i mogą współpracować z odpowiednimi adapterami.
msemelman
1
Niedługo to zrobię!
Dennis
2
w Australii jest rok 2016. Czy możemy uzyskać najnowsze łącza do komunikacji równorzędnej w przeglądarce?
Ganesh Krishnan
1
Tak, a co z tą aktualizacją?
obskyr
6

Muszę cię rozczarować - obecnie nie jest to możliwe tylko w przypadku JavaScript. Websockets (i Socket.IO) umożliwiają połączenie typu gniazdowego między klientem a serwerem, ale nie między klientami. Twoją opcją jest wtyczka - czy to Flash, Silverlight, Java lub wykonana na zamówienie.

Możesz użyć socket.io i emulować to, pisząc prosty serwer proxy.

Emil Ivanov
źródło
Czy jesteś pewien, że WebSocket nie pozwala na bezpośrednie połączenie P2P między 2 przeglądarkami? z tego, co mówi wikipedia, brzmi to tak, jakby można: „WebSocket to technologia zapewniająca dwukierunkowe kanały komunikacyjne w trybie pełnego dupleksu za pośrednictwem pojedynczego gniazda protokołu kontroli transmisji (TCP). Jest przeznaczona do implementacji w przeglądarkach internetowych i sieci serwerów, ale może być używany przez dowolną aplikację kliencką lub serwerową ”.
Răzvan Flavius ​​Panda
5
Problem rozwiązany, jeśli nie możesz mieć przeglądarki LISTEN/ działać jako serwer. Będziesz mógł komunikować się z dowolnym serwerem w trybie pełnego dupleksu, ale Twoi klienci nie mogą zostać serwerami. Dodatkowo, jeśli możesz, napotkasz milion problemów z zaporami ogniowymi. Rozwiązanie Emila zadziała lepiej, choć wolniej.
Ghayes
Z technicznego punktu widzenia gniazda sieciowe mogą być używane wszędzie. Ale w przeglądarkach, ze względu na ograniczenia bezpieczeństwa, tak się nie stanie. Ghayes wyjaśnił to. Zwróć też uwagę, że to rozwiązanie prawdopodobnie będzie szybsze , ponieważ zazwyczaj serwery są umieszczane w miejscach o ogromnych przepustowościach, więc twój serwer poradzi sobie dobrze ze 100 klientami, podczas gdy używając prawdziwego p2p bardzo szybko nasycisz połączenie użytkowników.
Emil Iwanow
@Emil Ivanov: To prawda, co mówisz, ale jeśli jest to tylko połączenie 1to1, powinno być szybsze.
Răzvan Flavius ​​Panda
3

Chciałbym zwrócić Twoją uwagę na fakt, że obecnie większość użytkowników znajduje się za NATem lub zaporami ogniowymi, a to oznacza, że ​​nie można łatwo nawiązać połączenia przychodzącego z komputerem użytkownika. Tak więc Twój pomysł zadziała (jeśli kiedykolwiek będzie to możliwe) tylko w niektórych przypadkach i zwiększy złożoność Twojego rozwiązania. Dlatego lepszym rozwiązaniem jest system klient-serwer z możliwie trwałym połączeniem (przy użyciu websockets lub socket.io).

Oddzwonienie Eugene Mayevskiego
źródło