是否可以使用单向 socket.io 连接?

Posted

技术标签:

【中文标题】是否可以使用单向 socket.io 连接?【英文标题】:Is it possible to have a one way socket.io connection? 【发布时间】:2015-06-09 08:37:49 【问题描述】:

我的应用程序只需要 socket.io 将数据从服务器发送到客户端。为了防止拒绝服务攻击,如果我尝试发送数据,我想断开客户端。这可能吗?

我查看了一些 *** 问题:

force client disconnect from server with socket.io and nodejs

How to protect against distributed denial-of-service attacks in Node.js with Socket.io?

但我一直未能找到可行的解决方案。

【问题讨论】:

Server-sent events怎么样 查看这个 SO 问题:***.com/questions/21057882/… 上证所被认为是安全的吗?它可以防止拒绝服务吗? 【参考方案1】:

有一个缓存所有事件的选项(从这里Socket.io Client: respond to all events with one handler?)。

然后在任何情况下,您都将断开服务器端的客户端。

var socket = io.connect();
var globalEvent = "*";
socket.$emit = function (name) 
    if(!this.$events) return false;
    for(var i=0;i<2;++i)
        if(i==0 && name==globalEvent) continue;
        var args = Array.prototype.slice.call(arguments, 1-i);
        var handler = this.$events[i==0?name:globalEvent];
        if(!handler) handler = [];
        if ('function' == typeof handler) handler.apply(this, args);
        else if (io.util.isArray(handler)) 
            var listeners = handler.slice();
            for (var i=0, l=listeners.length; i<l; i++)
                listeners[i].apply(this, args);
         else return false;
    
    return true;
;
socket.on(globalEvent,function(event)
    //Force disconnect
    socket.disconnect();
);

【讨论】:

【参考方案2】:

这可能不是很有帮助,但我听说做的最好的是Comet streams。这是一种较旧的方法,很多人不喜欢它(包括我自己),但它是单向服务器到客户端更新的一种选择。

本质上,在客户端,您有一个连接到服务器的iframe,服务器以multipart 响应的形式发回响应,偶尔将带有一些东西的script 标签发回给执行。所以,一个微不足道的(可能是坏的)例子是这样的:

<!--index.html-->
<html>
  <body>
    <iframe src="/comet/status"></iframe>
  </body>
</html>

然后是服务器代码...

// server code (I like Node.JS)
app.get('/comet/status', function (req, res) 
  // A function that does a lot of work,
  //  and occasionally calls a callback with progress
  doWork(function (progress) 
    res.write('<script>console.log("Progress: " + progress);</script>');
  );
  res.end();
);

就像我说的那样,这是一个非常不完整的示例,但它是一种完成您正在寻找的东西的方法,即使是以较旧的方式。您可能会更新显示进度的元素,而不是控制台日志记录。

【讨论】:

以上是关于是否可以使用单向 socket.io 连接?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以仅在用户登录时连接 Socket.io?

Socket.Io与WebSockt

cocos creator随笔

io() 函数前端——socket.io

Socket.io:WebSockets 可以处理多少并发连接?

是否可以将 Websockets/Socket.IO 与蜂窝数据/4g 一起使用?