一个http 到websocket 的推送服务器雏形代码,有些问题请大神指教
发布于 8 年前 作者 cnlile 4433 次浏览 来自 问答

下午,花了点时间写了简单的http到websocket 服务的雏形,觉得有些问题,我把代码贴出来 var bodyParser = require(‘body-parser’); var express = require(‘express’), app = express(), server = require(‘http’).createServer(app), io = require(‘socket.io’).listen(server); //引入socket.io模块并绑定到服务器 app.use(’/’, express.static(__dirname + ‘/www’)); app.use(bodyParser.json());

app.get(’/’, function(req, res){ res.send(‘laugh’); })

app.post(’/info’, function(req, res){ //链接id var id = req.body.id; //存放信息 var info = req.body.info; //保存消息记录的数据对象 message[id] = info; res.send(‘laugh’); })

//消息记录 var message = []; //保存socket 记录表 var sockets = []; //链接ID var id = 0;

server.listen(8000);

//socket部分 io.on(‘connection’, function(socket) {

//接收并处理客户端发送的foo事件
socket.on('login', function(data) {
    //保存链接ID
    sockets[id] = socket;
    socket.id = id;
    id++;
    socket.emit('reg', { 'id': id });
    console.log("login name:" + data.name + ", id:" + id);
});

//计时器,2秒一次
var tweets = setInterval(function () {
    //如果有消息,则发送
    if (message[socket.id] != null){
        socket.volatile.emit('info', message[i]);
    };
}, 2000);

socket.on('disconnect', function () {
    clearInterval(tweets);
});

});

//2秒触发事件发送, 计数器 var ms = 2000; var timer = setInterval(function(){ for(var i =0 ; i < message.length ;i++){ //搜索数据,存在发送 if(message[i] != null ){ sockets[i].emit(‘info’, message.i); }; }; }, ms); ---------------------------------------------------- 第一个问题,这个思路是否可以,通过websocket 的login 返回一个登录id,保存,然后http 收到post信息,就推送到这个登录的链接的端口。 第二个问题,我写了2个计时器,检测是否收到http方面的消息,然后推送, 第一个在监听事件,链接时候产生,断开销毁,第二个永久保留全局检测,不知道那个好,尤其是socket 是否可以增加对象id,没有把握。 各路大神帮忙看看。

4 回复

你这排版让人提不起精神啊

socket.id = id;你把这个socket.id覆盖了什么意思,覆盖了肯定是不行的。socket识别不同客户端以及其他功能全靠它,你覆盖了,socket还怎么工作

socket自身有个id属性,不用另外去设置id

全局messages这个数组相当于离线消息内存数据库(当然你也可以存到mysql里). 你的流程应该是:

  1. http接到消息, 查找socket是否存在, 存在就转发, 不存在就存入离线消息库里.
  2. 新的socket产生时, 查询离线消息库, 有离线消息, 就全部转发出去

所以, 不需要计时器. 当然, 上面的第2步也可以搞成一个全局计时器, 避免某一时刻资源消耗过大. 看你选择了

回到顶部