Подтвердить что ты не робот

Socket.io: Не удалось загрузить ресурс

Я пытаюсь начать работу с socket.io и node.js.

Следуя первому примеру на сайте socket.io, я получаю следующую ошибку в консоли браузера:

Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:3001/socket.io/socket.io.js
Uncaught ReferenceError: io is not defined 

Это мой server.js

var app = require('express').createServer()
  , io = require('socket.io').listen(app);

app.listen(3001);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

И это мой index.html

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="UTF-8" />
  </head>
  <body>
    <script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>
  </body>
</html>

Я уже установил socket.io..

4b9b3361

Ответ 1

Проблемы

  • Прежде всего вам нужно посмотреть порт сервера, на который сервер связан (app.listen(3001);) на стороне клиента, чтобы вообще добраться до сервера.

  • Что касается socket.io, то добавление http://localhost:3001 до остальной части исходного кода в теге ссылки решает эту проблему. Это, по-видимому, связано с тем, как сеть связывает порты с localhost, однако я попытаюсь найти дополнительную информацию о причине;

Что нужно изменить:


Связывание портов для сервера:

var socket = io.connect('http://localhost');

следует изменить на

var socket = io.connect('http://localhost:3001');



Создание socket.io behave:

<script src="/socket.io/socket.io.js"></script>

следует изменить на

<script src="http://localhost:3001/socket.io/socket.io.js"></script>


Ответ 2

Если вы используете express версию 3.x, есть проблемы Socket.IO, для которых требуется небольшая настройка для настройки:

Socket.IO .listen() метод принимает экземпляр http.Server в качестве аргумента.
Начиная с 3.x, возвращаемое значение express() не является экземпляром http.Server. Чтобы заставить Socket.IO работать с Express 3.x, убедитесь, что вы вручную создали и передали свой экземпляр http.Server в метод Socket.IO .listen().

Вот краткий пример:

var app = express()
  , http = require('http')
  , server = http.createServer(app)
  , io = require('socket.io').listen(server);

server.listen(3000);

Ответ 3

Во-первых, документация Socket.io " Как использовать" является неопределенной (возможно, вводящей в заблуждение); особенно при документировании кода для клиента Socket.io.

Во-вторых, ответы, которые вы получили здесь, на StackOverflow, слишком специфичны. Вам не нужно вручную жестко кодировать протокол, имя хоста и номер порта для клиента Socket.io; что это не масштабируемое решение. Javascript может справиться с этим для вас с объектом местоположения - window.location.origin.

Начало работы с Socket.io

Установка

Socket.io требует установки сервера и клиента.

Чтобы установить сервер
npm install socket.io

Чтобы использовать клиент, добавьте этот script в свой документ (index.html)
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>

Реализация с помощью Express 3/4

Создайте следующие файлы:

Сервер (app.js)

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(80);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

Клиент (index.html)

<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
<script>
  // origin = http(s)://(hostname):(port)
  // The Socket.io client needs an origin
  // with an http(s) protocol for the initial handshake.
  // Web sockets don't run over the http(s) protocol,
  // so you don't need to provide URL pathnames.
  var origin = window.location.origin;
  var socket = io.connect(origin);
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

Ответ 4

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

var host = window.location.hostname; 
var socket = io.connect('http://' + host);

Если вы используете https, то, очевидно, вам также необходимо изменить протокол. В моем случае мне нужно было создать сервер, который будет работать на нескольких локальных компьютерах, поэтому установка фиксированного адреса не будет работать, поскольку сокет должен подключаться к другому адресу в зависимости от того, на каком сервере вы загружаете страницу. Добавление этого здесь, поскольку это может помочь кому-то еще.

Ответ 5

Попробуйте это

var app = express()
,http = require('http');

var server = http.createServer(app);
server.listen(3001);
io = require('socket.io').listen(server);
io.set('log level', 1); 

Надеюсь, что это поможет

Ответ 6

Я знаю, что это очень поздно, но я нашел решение для тех, кто ранее устанавливал node.js up. Моя машина нуждалась в замене аппаратного обеспечения, когда она вернулась, я заметил, что некоторые настройки вернулись к factory по умолчанию. Я также получил ошибку, о которой говорилось выше.

Запуск

sudo apachectl start

с терминала исправил мою проблему.