如何基于客户端在socket.io中发出事件?

时间:2014-02-17 11:11:15

标签: node.js express socket.io

我正在使用node.js, express and socket.io开发实时数据可视化应用程序。

要求:

必须根据客户端请求发出事件。

例如:如果用户输入的网址为http://localhost:8080/pages,则socket.io应向客户端发出主题pages,另一个用户请求http://localhost:8080/locations套接字应该向该特定用户发出location

代码

    var server = app.listen("8080");
    var socket = require('socket.io');
    var io = socket.listen(server);
    var config = {};
    io.on('connection', function (socket) {
          config.socket = io.sockets.socket(socket.id);
          socket.on('disconnect', function () {
             console.log('socket.io is disconnected');
          });
    });



    app.get('/*', function(req, res) {
      var url = req.url;
      var eventName = url.substring('/'.length);
       //pages and locations
      config.socket.volatile.emit(eventName, result);
    });

客户代码:

          //No problem in client code.Its working correctly. 
            Sample code as follows
          socket.on('pages', function (result) {
               console.log(result);
          }); 

问题:

它向两个客户端发送pageslocations

任何克服这个问题的建议。

2 个答案:

答案 0 :(得分:1)

我无法理解你的方法,但因为你说你正在渲染不同的页面,这意味着你可以提供不同的代码,那么这样做是怎么回事:

服务器端:

var server = app.listen("8080");
var socket = require('socket.io');
var io = socket.listen(server);
var config = {};

app.get('/pages', function(req, res) {
  res.render('pages.html');
});

app.get('/locations', function(req, res) {
  res.render('locations.html');
});

io.on('connection', function (socket) {
   socket.on('pagesEvent', function(data){
     socket.volatile.emit('pages', {your: 'data'});
   });
   socket.on('locationsEvent', function(data){
     socket.volatile.emit('locations', {your: 'data'});
   });
});

在客户方:

<强> pages.html:

socket.on('connect', function(){
  socket.emit('pagesEvent', {});
});
socket.on('pages', function(data){
  // do stuff here
});

<强> locations.html:

socket.on('connect', function(){
  socket.emit('locationsEvent', {});
});
socket.on('locations', function(data){
  // do stuff here
});

答案 1 :(得分:-1)

你做错了,WebSockets应该在两个方向上都一样。客户端向服务器发出事件,服务器发回客户端/订阅者。

你做事的方式,似乎是一种实现API的方式,但出于某种原因,你试图用WebSockets而不是XHR来实现它。