【问题标题】:How to push changes in a database to the client using socket.io?如何使用 socket.io 将数据库中的更改推送到客户端?
【发布时间】:2013-06-04 16:35:23
【问题描述】:

我正在开发一个应用程序,其中包括在数据库发生更新时将数据推送到客户端。问题是 node.js 上的 websocket 侦听与节点不同的端口上的数据库。我之前的那个人写了一段代码,然后把它扔给了我。节点看起来有点像这样:

var handler=http.createServer(function(req, res){
session(req, res, function(req, res, body) {
    if (!req.session || !req.session.data || !req.session.data.uid || req.session.data.uid == '' || !req.session.data.role || req.session.data.role =='') {
        var uri = url.parse(req.url).pathname;
    if(req.method == 'GET' && uri =="/attendance-node/getMonthFromReport") {
        var uri = url.parse(req.url).pathname;
        var url_parts = url.parse(req.url,true);
        processgetMonthFromReport(req, res, uri, url_parts.query);
        return;
    }
        res.writeHead(401, {"Content-Type": "text/plain"});  
        res.write("401 Unauthorized");
        res.end();
        return;
    }
    if(req.method == 'POST') {
        var uri = url.parse(req.url).pathname;
        var qs = require('querystring');
        var POSTVAR = qs.parse(body, '&', '=', {"maxKeys" : 0});
        //var POSTVAR=JSON.parse(body);
        handleRequest(req, res, uri, POSTVAR);
    }

    if (req.method=='GET') {
        var uri = url.parse(req.url).pathname;
        var url_parts = url.parse(req.url,true);
        handleRequest(req, res, uri, url_parts.query);

    }
});
}).listen(3014,"127.0.0.1");

var io = require('socket.io').listen(8077,"127.0.0.1");
sys.puts("websocket Server running on port 8077");

io.configure(function () {
io.set('transports', ['websocket', 'flashsocket', 'xhr-polling','jsonp-polling']);
io.set('log level', 0);
});
io.sockets.on('connection', function (socket) {
io.sockets.emit('init',"i am working via websocket");
});

如您所见,节点在 3014 上侦听,套接字在 8077 上。现在我应该如何为套接字上接收到的消息提供处理程序并将其转发到节点的客户端?

注意:我对 Web 开发还很陌生。所以基本上我被扔进了水里,现在我正在学习游泳。

附:另外,socket 的客户端是什么样子的?

附言向套接字发送更新通知的数据库已经得到处理。它以 POST 请求的形式出现。 提前谢谢!!

【问题讨论】:

  • 数据库更新(通知)是通过端口 8077 还是通过 3014 上的网络服务器进入 websocket 的?还有什么原因你不通过网络服务器提供 socket.io 吗?
  • @travis 是的,请求来自 8077 端口,来自客户端的请求来自 3014。我需要在 8077 上接收请求,然后在 3014 上向客户端发出消息。跨度>

标签: javascript node.js socket.io


【解决方案1】:

听起来您也希望在客户端(浏览器?)上也有 socket.io。

我认为最好的解决方案是让 socket.io 与您的 Web 服务器在同一个端口上运行。但是,如果这不可能,并且您必须将数据库使用的 Web 套接字与 Web 服务器分开,您可以运行两个 socket.io 实例。

一个连接到网络服务器,另一个连接到数据库。

var app = require('http').createServer(handler)
  , IO = require('socket.io')
  , web_io = IO.listen(app)
  , data_io = IO.listen(8080)
  , fs = require('fs')

app.listen(80);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

web_io.sockets.on('connection', function (socket) {
  socket.on('some_event', function (data) {
    console.log(data);
  });
});

data_io.sockets.on('connection', function (socket) {
  socket.on('database_update', function (data) {
    // Will be sent to everyone socket listening on port 80 (browser sockets mostlikely)
    web_io.sockets.emit('database_update', data);
  });

  socket.on('disconnect', function () {
    io.sockets.emit('user disconnected');
  });
});

【讨论】:

    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2019-02-05
    相关资源
    最近更新 更多