Отладка nodejs обслуживала статический контент /socket.io в Windows 7/8 32- и 64-разрядной версии и в облаке9

Я не могу заставить socket.io работать на моей машине с одним из самых простых примеров чата socket.io (просто предварительный тест) Гильермо Рауха локально и на платформе cloud9. Я пробовал socket.io в сочетании с Express 2.5.x и Express 3 (соответственно изменив код сервера) и получил то же поведение, используя как Nodeclipse, так и запуск командной строки:

информация: socket.io запущен
Сервер сокетов работает @ localhost на порту 3000

Когда я посещаю localhost:3000, я получаю:

отладка: обслуживается статический контент /socket.io

Нет рукопожатия и, возможно, клиент не подключается.
Возможно, проблему легко увидеть, но я не нашел ответа, подходящего для моего случая ни здесь, ни где-либо еще. Вот моя среда:

Windows 7 x86 или Windows 8 64-разрядная; Nodeclipse на последнем стабильном узле (0.10.15, если не ошибаюсь); использовано: google chrome, firefox, IE последней версии;

пытался также обслуживать индексную страницу через сервер WAMP;

перепробовал много альтернатив, которые, кажется, предполагают, что это не проблема кода, а принадлежность к чему-то другому (экспресс не работает с последними установками узла? что-то не так с переменными среды?);

Express, кажется, обслуживает файл /socket.io/socket.io.js, поскольку он доступен для чтения через любой браузер, когда я ввожу localhost:3000/socket.io/socket.io.js (я не знаю, правильно ли это тестовое задание).

Вот код клиента:

<!doctype html>
<html>
<head>
    <title>my test</title>
    <script src="/socket.io/socket.io.js"></script>
    <script src="chat.js">
    <link href="/stylesheets/style.css" rel="stylesheet" />
</head>
<body>
    <div id="chat">
        <ul id="messages"></ul>
        <form id="form">
            <input type="text" id="input" />
            <button>Send</button>
        </form>
    </div> 
</body>
</html>

Вот серверное приложение:

var express = require('express');
var sio = require('socket.io');
var app = express.createServer(
        express.bodyParser(),
        express.static('public'));
app.listen(3000);

var io = sio.listen(app);

console.log('Socket server running @ localhost on port ' + 3000);

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

chat.js содержит:

window.onload = function() {
    var socket = io.connect("http://localhost:3000");
    socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
};

это версии socket.io и экспресс, установленные локально (экспресс также устанавливается глобально) с помощью команды установки npm, заданной из папки рабочей области nodeclipse (c:/users/myname/workspace/nameoftheapp) "express": "2.5.4 ", "socket.io": "0.9.16"

Структура проекта

node_modules  
|- [...] (all the installed folders and files]  
public  
|- stylesheets  
--|-style.css  
|- index.html  
app.js  
package.json  
readme.md  

Должен ли я установить что-то в соединении, чтобы правильно указать на мою рабочую область?


person Dario Rizzo    schedule 08.08.2013    source источник


Ответы (2)


Вам нужно использовать http.createServer вместо express.createServer

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

server.listen(3000, function () {
  console.log("listening on port 3000");
});
person Peter Lyons    schedule 08.08.2013
comment
Это должно быть правдой, если я использую express3.x, потому что экспресс стал «функцией», но даже если я использую экспресс 3 с этим кодом, я получаю то же самое. Я начинаю думать, что клиент не может подключиться по какой-то причине, и, возможно, это связано с клиентом socket.io (страница обслуживается), но я не знаю, как изменить код. Любое другое предложение? Более того, используя плагин узла Aptana для Eclipse, мне удалось установить параметр подключения, через который папка проекта «указывает» на себя, и вроде бы все работает (происходит рукопожатие), но что произойдет, когда проект будет загружен на настоящий узел сервер? - person Dario Rizzo; 08.08.2013
comment
Дарио, нам нужны подробности. К сожалению, заставить работать экспресс и socket.io очень сложно. Вы должны использовать экспресс 3. Если вы этого не сделаете, код будет совершенно другим и запутанным. Уделите пристальное внимание объектам app, server и io, так как их легко перепутать, и они имеют похожие API, и есть только один правильный способ, который действительно будет работать. Я говорю вам прямо сейчас, что вы звоните express.createServer вместо http.createServer и ЭТО ПРОБЛЕМА. Используйте экспресс 3 и сделайте это, и все будет работать. - person Peter Lyons; 09.08.2013

Я столкнулся с этим вопросом, пытаясь понять, как использовать socket.io в Cloud9. Я не знаю, как Cloud9 влияет на ваш вопрос (хотя это упоминается в вашем заголовке), но мне не удалось установить рукопожатие от клиента, и я получил только сообщение debug: served static content в Терминал Cloud9. В конце концов я понял, что причиной проблемы была ссылка на соединение в клиенте. Настройка Express с помощью socket.io тоже была непростой, так как вы можете запутаться между различными переменными, как сказал Питер.

Код сервера:

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

server.listen(process.env.PORT || 3000, function() {
    console.log('Express server started on port %s', process.env.PORT);
});

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

Код клиента:

<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect(window.location.hostname);
    socket.on('news', function(data) {
        console.log(data);
        socket.emit('my other event', {
            my: 'data'
        });
    });
</script>

Я использовал window.location.hostname, чтобы скрипт работал как на тестовом сервере Cloud9, так и везде, где я развертываю свое приложение (в моем случае Heroku).

Используется с Express 3.2.6 и Socket.io 0.9.13.

person Wei Hao    schedule 23.10.2013