Как я могу сделать браузер для браузера (одноранговое) соединение?

Как я могу написать сайт с использованием HTML5, CSS и JavaScript на стороне клиента, который позволит прямое соединение tcp/ip между клиентскими браузерами после загрузки страницы.

Мне нужно сделать это, чтобы уменьшить латентность, так как сайт потребует, чтобы вход от одного из пользователей был передан другому пользователю как можно скорее, поэтому отправка данных от клиента A к серверу, а затем к клиенту B не очень хороший вариант.

Я читал предыдущие сообщения по этому вопросу, но не было доступных рабочих решений/примеров, которые я мог бы найти. Из того, что я читал, прямое соединение между клиентами можно сделать с помощью плагинов, таких как Silverlight, Java или Flash.

Есть ли какое-либо решение, которое не требует плагинов? Я хотел бы использовать только JavaScript.

Ответ 1

Здесь в Stackoverflow есть несколько тем о соединениях P2P в браузерах:

Как упоминалось в большинстве тупиков, в обоих проектах HTML5, работающих в HTML5, был раздел "Одноранговые соединения":

Поскольку рабочий проект W3C 12 февраля 2009 г., раздел "Одноранговые соединения" исчез. Но это соединение P2P не исчезло. Он возвращается под названием PeerConnection в спецификациях WebRTC (Real-Time Communications):

С 31 октября 2011 года проект редактора W3C является официальным рабочим проектом:

Единственная реализация PeerConnection (UDP-based) существует в модифицированном WebKit лабораториями Ericsson (май 2011 г.), которая работает достаточно хорошо. Некоторые исправления находятся в WebKit сейчас (октябрь 2011 года - см. Обновления ниже!):

Кроме того, инициатива WebRTC представляет собой проект Google, Mozilla и Opera. Таким образом, они продолжают спецификацию на PeerConnection:

Возможно, Chrome (использует WebKit) станет первым крупным браузером, поддерживающим WebRTC с PeerConnection:

С 18 января 2012 года Chrome также поддерживает WebRTC. Он может использоваться в канале Dev (Windows, OSX, Linux) и Canary build (Windows и OSX) включив его под chrome://flags. Он поддерживает только MediaStream как видео и аудио и может быть протестирован с несколькими Demos. Передача данных приложения, например String/ArrayBuffer/... не поддерживается до сих пор.

Поскольку 16 марта 2012 года, проект редактора WebRTC разделяет "Peer -to-peer Data API" для отправки и получения данных общего приложения (String, ArrayBuffer и Blob). Chromium хочет реализовать API данных в ближайшее время (10 апреля 2012 г.).

3 апреля Mozilla опубликовала первый рабочий пример WebRTC для Firefox.

DataChannel запланирован для версии 25 Chrome, за флагом, тем временем его можно протестировать в Firefox Nightly/Aurora (12 декабря 2012 года):

Ответ 2

Я должен буду вас разочаровать - в настоящее время это невозможно с помощью только JavaScript. Websockets (и Socket.IO) позволяют сокет-подобное соединение между клиентом и сервером, но не между клиентами. Ваш вариант - плагин - будь то Flash, Silverlight, Java или пользовательский.

Что вы можете сделать, это использовать socket.io и эмулировать это, написав простой прокси-сервер.

Ответ 3

Я хотел бы обратить ваше внимание на то, что большинство пользователей в настоящее время находятся за NAT или брандмауэрами, а это означает, что вы не можете легко установить входящее соединение с пользовательским компьютером. Таким образом, ваша идея (если вообще возможно) будет работать только в некоторых случаях и привнесет дополнительную сложность в ваше решение. Таким образом, клиент-серверная система с возможным постоянным подключением (с использованием websockets или socket.io) является лучшим вариантом.