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..
Ответы
Ответ 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
с терминала исправил мою проблему.