2015-04-13 2 views
2

Мне нужен сервер, чтобы иметь возможность принимать соединения как из интернет-магазинов, так и из сокетов.io, возможно ли это? Когда я запускаю только socket.io, также клиент socket.io работает отлично, но стандартный клиент websocket не может подключиться. С другой стороны, когда я запускаю сервер websocket вместе со socket.io, websocket worsk хорошо, но в браузере, который пытается подключиться через socket.io, я вижу ошибку WebSocket connection to ... failed: Invalid frame header. Возможно ли, чтобы оба соединения работали на одном экземпляре сервера?websocket client to socket.io

Я использую express.io и websocket-node, и было бы здорово заставить его работать только с express.oi.

+0

Зачем вам это нужно? socket.io является дополнительным протоколом поверх WebSocket, поэтому вы не можете использовать один и тот же код на стороне сервера, чтобы прослушивать как простой webSocket, так и соединение socket.io. Было бы проще разместить одно из двух соединений на другом порту и просто использовать для каждого другого обработчика, позволяя стандартной библиотеке для каждого дескриптора, для чего они были созданы. – jfriend00

ответ

0

Хотя @ jfriend00 прав, что socket.io является дополнительным протоколом поверх webSocket, я обнаружил, что дополнительный протокол может быть довольно простым. Я думаю, что сервер [email protected] неявно запускает сервер WebSocket на основе [email protected], мне удалось (с помощью F12/сетевого инструмента) подключиться к нему с помощью собственного клиента WebSocket.

socket.io клиент:

var socket = io('http://localhost'); 
socket.emit('hello', 'there'); 

WebSocket клиент:

var ws = new WebSocket('ws://localhost/socket.io/?EIO=3&transport=websocket'); 
ws.send('42' + JSON.stringify(['hello', 'there'])); 
// ws.onmessage will get a MessageEvent object with the data property being encoded in the similar way. 

Socket.IO API является более абстрактным, он имеет дело с событием и аргументами, в то время как WebSocket API занимается строкой.

+0

Что случилось с 'ws.send ('42 '...'? Является ли '42' по какой-либо причине? – Mobilpadde

+1

@Mobilpadde Да, я думаю, что это номер типа сообщения. Если я правильно помню, есть по крайней мере, еще один номер для сообщения «зонда». – pzy

+1

@Mobilpadde Вы можете сами увидеть: откройте https://socket.io/demos/chat/ в Chrome, в сети F12>, фильтруйте с помощью «EIO = 3 & transport = websocket «должны быть некоторые из них, а заголовки ответов должны содержать« Соединение: обновление », а также вкладка« Фреймы »на панели подробностей вместо вкладок« Предварительный просмотр »и« Ответ »для обычных HTTP-запросов. Содержимое перечисленные на вкладке «Фреймы», довольно интуитивно понятны, например «2probe», «42 [« login », {numUsers: 10}]». Я думаю, что браузеры здесь поддерживают websocket, то есть обновленный HTTP, а не Socket.IO – pzy