Nodejs 对于net模块,客户端flash的policy请求,可以写在connect事件里吗?

Nodejs 对于net模块,客户端flash的policy请求,可以写在connect事件里吗?

var net = require(“net”),

net.createServer( function(socket) {

socket.on(“connect”, function(d){ socket.write("<cross-domain-policy><allow-access-from domain=’’ to-ports=’’ secure=‘false’ /></cross-domain-policy>\0"); });

socket.on(“data”, function(str){ console.log("data: " +str); socket.write(str);

}); }).listen(3000);;


4 回复

Node.js 对于 net 模块,客户端 Flash 的 policy 请求,可以写在 connect 事件里吗?

在 Node.js 中使用 net 模块处理 TCP 服务器时,通常会遇到 Flash 客户端发送的 policy 文件请求。这种请求是为了确保客户端能够通过跨域策略文件(cross-domain policy file)访问服务器。

示例代码

const net = require('net');

net.createServer(function(socket) {
  // 监听连接事件
  socket.on('connect', function() {
    // 向客户端发送跨域策略文件
    socket.write('<cross-domain-policy><allow-access-from domain="*" to-ports="*" secure="false" /></cross-domain-policy>\0');
  });

  // 监听数据接收事件
  socket.on('data', function(data) {
    console.log('Received data:', data.toString());
    // 可以将接收到的数据返回给客户端
    socket.write(data);
  });
}).listen(3000, () => {
  console.log('Server listening on port 3000');
});

解释

  1. 创建服务器:

    net.createServer(function(socket) { ... }).listen(3000);
    

    这行代码创建了一个 TCP 服务器,并监听 3000 端口。

  2. 监听连接事件:

    socket.on('connect', function() { ... });
    

    在这里,我们监听了 connect 事件。当客户端与服务器建立连接后,该事件会被触发。

  3. 发送跨域策略文件:

    socket.write('<cross-domain-policy><allow-access-from domain="*" to-ports="*" secure="false" /></cross-domain-policy>\0');
    

    当客户端连接到服务器时,服务器会立即向客户端发送一个包含跨域策略文件的字符串。这个字符串告诉客户端它可以访问任何域名的任何端口。

  4. 监听数据接收事件:

    socket.on('data', function(data) { ... });
    

    我们还监听了 data 事件,以便处理从客户端接收到的数据。在这个例子中,我们将接收到的数据直接返回给客户端。

结论

虽然 connect 事件确实会在客户端连接时触发,但通常情况下,发送跨域策略文件的最佳时机是在客户端连接时立即发送。因此,将跨域策略文件的发送放在 connect 事件处理器中是一个合理的选择。这样可以确保在客户端尝试发送其他数据之前,已经接收到所需的策略文件。


没这个必要。还是先验证收到的数据是不是<policy-file-request/>为好。 设置个超时也是必要的,以免大量空连接上来消耗资源。

验证完以后,这个socket就结束了,然后后续的新的发送真实数据的socket在connect的时候还是没有状态的,如果我要维护一个在线的socket列表,在on,connect 根本没办法判断哪个是发<policy-file-request/> 的socket,哪个是发真实数据的socket 如果用单独的843端口,会有防火墙之类的东西

对于 Node.js 中 net 模块处理 Flash 的跨域策略文件请求,不能直接将策略文件发送放在 connect 事件中。因为 connect 事件在客户端连接到服务器时触发,但此时客户端可能还没有准备好发送数据。

正确的做法是监听 data 事件,在该事件中判断是否收到 <policy-file-request/> 字符串,然后发送策略文件响应。下面是一个示例代码:

var net = require('net');

net.createServer(function (socket) {
  socket.on('data', function (data) {
    if (data.toString().trim() === '<policy-file-request/>\0') {
      socket.write('<cross-domain-policy><allow-access-from domain="*" to-ports="*" secure="false"/></cross-domain-policy>\0');
      socket.end(); // 结束连接,因为策略请求已经完成
    } else {
      console.log('Received:', data.toString());
      socket.write(data); // 回显数据
    }
  });
}).listen(3000, () => {
  console.log('Server listening on port 3000');
});

这段代码创建了一个简单的 TCP 服务器,它会监听 3000 端口。当客户端连接并发送数据时,服务器会检查数据是否为 <policy-file-request/>。如果是,则发送跨域策略文件并结束连接;否则,它将回显接收到的数据。

这种方法确保了只有在客户端明确请求策略文件时才发送响应,并且不会在不必要的时候发送数据。

回到顶部