2015-04-20 4 views
0

Я хочу реализовать функциональность push-сервера на стороне сервера, используя NodeJS. На данный момент, все, что я хочу, это сервер, который слушает запросы к конкретному URL (например http://localhost:8000/inputData?data=hello)Наращивание на стороне сервера с помощью NodeJS

После этого запрос был сделан, я хочу, чтобы все клиенты смотровые client.html запустить alert(hello);. То, что я сделал, заключается в следующем, на стороне сервера:

var app = require('http').createServer(handler), 
    io = require('socket.io').listen(app), 
    parser = new require('xml2json'), 
    fs = require('fs'), 
    url = require('url'); 



var qs = require('querystring'); 

app.listen(8000); 
console.log('server listening on localhost:8000'); 

function handler(req, res) { 
    var url_parts = url.parse(req.url, true); 
    var pathname = url_parts.pathname; 
    switch(pathname){ 
     case '/inputData': 
     var data = url_parts.query.data; 
     socket.emit('notifyData', data); //socket is undefined 
     break; 
     default: 
     fs.readFile(__dirname + '/client.html', function(err, data) { 
      if (err) { 
      console.log(err); 
      res.writeHead(500); 
      return res.end('Error loading client.html'); 
      } 
      res.writeHead(200); 
      res.end(data); 
     }); 
    } 

    ; 
} 

На стороне клиента, в client.html:

<script> 
    var socket = io.connect('http://localhost:8000'); 

    socket.on('notifyData', function (data) { 
     alert(data); 
    }); 
</script> 

Я получаю ошибку о том, что socket не определен. Я знаю, что я должен определить это раньше, но я не уверен, как это сделать.

Правильно ли это подходит к такой проблеме? или должен быть emit в другом файле, например. inputData.html? Я бы скорее дополнил код, который у меня уже есть, потому что мне может потребоваться выполнить ряд операций прямо перед var data= url_parts.query.data

+1

Вы включили [reference] (http://socket.io/download/) в socket.io на своей стороне клиента? '' –

+0

Да, я сделал '' –

ответ

1

У вас есть вопрос дизайна на вашем сервере, как переменная socket не определяется. Если то, что вы пытаетесь сделать, это транслируется на всех клиентов, когда один попадает этот конкретный URL, то вы можете сделать это с помощью:

io.sockets.emit('notifyData', data); 

Если вы пытаетесь испустить к одной розетке клиента, то вам нужно будет найти способ выяснить, какой сокет в пространстве имен io.sockets это то, к которому вы пытаетесь отправить.

+0

Точно, я хотел передать всем клиентам, когда кто-либо из них ударит по этому URL-адресу. Я заменил 'socket.emit ('notifyData', data);' с 'io.sockets.emit ('notifyData', data);' и он сработал. Благодаря! –

0

От docs похоже, что вы не инициализировали сервер правильно.

var app = require('http').createServer(handler) 
var io = require('socket.io')(app); 
var fs = require('fs'); 

app.listen(8000); 

/*...*/ 

io.on('connection', function (socket) { 
    socket.emit('notifyData', { hello: 'world' }); 
}); 

и на клиенте вы должны иметь

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io('http://localhost:8000'); 
    socket.on('notifyData', function (data) { 
    alert(data); 
    }); 
</script> 
+0

Я попытался заменить 'socket.emit ('notifyData', data);' с 'io.on ('connection', function (socket) { socket.emit ('notifyData', {hello: 'world '}); }); ', я не получаю ошибку, но я все еще ничего не получаю на стороне клиента. –

Смежные вопросы