Я совершенно новичок в Node и даже новичок в Socket.io. Я только что получил свое первое приложение для чата онлайн на spaiglas.com, которое работает, несмотря на ошибку в консоли разработчика, которая довольно проста ...
WebSocket connection to 'ws://example.com/...' failed: Error during WebSocket handshake: 'Connection' header is missing
Вот кодовый ключ со всем моим кодом. Я загрузил его своему хостинг-провайдеру, который использует Passenger через cPanel на сервере Apache в среде Node 9.11.2.
Из того, что я читал, заголовки «Соединение» нельзя установить с помощью AJAX, что предположительно представляет угрозу безопасности, но вместо этого обрабатывается сервером? Можно ли вручную установить этот заголовок?
Я заметил, глядя на заголовки, что на раннем этапе обычно один из них всегда успешно переключает / обновляет протокол до WebSockets, но затем платформа всегда возвращается к HTTPS / опросу. В приведенном ниже случае, который я только что наблюдал, на самом деле было 2 из 67 случаев, когда он успешно переключился на протокол WebSockets и использовал его.
Я установил nginx и решил свою проблему
@Hermes, я не думаю, что когда-либо решал проблему, но я действительно не стал пытаться ее решить, так как длинный опрос работал отлично





Вам необходимо инициализировать socket.io перед запуском HTTP-сервера, который прослушивает порт 80. В документации это ...
var http = require('http').Server(app);
var io = require('socket.io')(http);
А потом вы звоните http.listen(3000, ...). Это запустит сокет.
На клиенте ваш путь тоже неверен. Websockets - это протокол (ws://somedomain.com), как и HTTP. Когда вы подключаетесь через http://, это другой протокол. Я бы либо ничего не передавал, либо использовал пространства имен, которые вы можете найти в документации socket.io.
Socket.io возвращается к длительному опросу и иногда даже не использует веб-сокеты (отчасти поэтому он обычно медленнее, чем такие библиотеки, как ws на npm). Из-за этого передача http: // в io (...) на клиенте может быть правильной с их библиотекой, но я бы все равно удалил ее и сделал свое предложение выше.
да, я инициализировал все это, что можно увидеть в коде. Думаю, мне просто нужно заменить socket = io.connect(...) на socket.io('url', { /* extraHeaders here*/ }). Я почти уверен, что если я установлю протокол на ws, тогда, когда веб-сокеты не работают и по умолчанию используется опрос, он сломается, не так ли?
проблема в том, что мне нужно выяснить, как установить заголовок "соединение"
на сервере порядок имеет значение. Вам нужно сделать то, что я сказал. В коде кода вы запустили прослушивание сервера до того, как запустили сервер socket.io. вам нужно изменить это, чтобы создать сервер, но не запускать его прослушивание. а затем запустите socket.io, а затем запустите прослушивание сервера. на клиенте просто удалите строку, которую вы ему передали. Это должно быть io.connect (), а не socket.io ("url", ...}
У меня уже была эта проблема, как и у вас. это порядок вашего кода на сервере. ваш клиент в порядке, просто удалите строку в io.connect ()
Хм? как мне не инициализировать socket.io перед инициализацией сервера? app = express() инициализирует сервер?
Я новичок во всем этом помню. Также, кстати, ты прав, я удалил протокол, так что теперь его просто io.connect('example.com:80')
@Gihan Saranga Siriwardhana есть идеи?
Если бы вы просто попробовали мое решение, оно бы исправлено. Причина, по которой ваш код не работает, заключается в том, что app = express () не запускает сервер. он инициализирует его, но сервер не запускается, пока вы не вызовете listen (). вам нужно убедиться, что вы вызываете listen для сервера ПОСЛЕ запуска socket.io.
У меня такая же проблема. Вы решили свою проблему?