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);;
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');
});
解释
-
创建服务器:
net.createServer(function(socket) { ... }).listen(3000);
这行代码创建了一个 TCP 服务器,并监听 3000 端口。
-
监听连接事件:
socket.on('connect', function() { ... });
在这里,我们监听了
connect
事件。当客户端与服务器建立连接后,该事件会被触发。 -
发送跨域策略文件:
socket.write('<cross-domain-policy><allow-access-from domain="*" to-ports="*" secure="false" /></cross-domain-policy>\0');
当客户端连接到服务器时,服务器会立即向客户端发送一个包含跨域策略文件的字符串。这个字符串告诉客户端它可以访问任何域名的任何端口。
-
监听数据接收事件:
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/>
。如果是,则发送跨域策略文件并结束连接;否则,它将回显接收到的数据。
这种方法确保了只有在客户端明确请求策略文件时才发送响应,并且不会在不必要的时候发送数据。