flash 访问java的socket交互安全策略问题.
#2048 安全沙问题搞了好久,未果,搞死人了.做flash的相信这个问题大不陌生.
网上一大堆方法,大多是在网站根路径下放crossdomain.xml
以前我用http写游戏一直是那样做都没问题.但这次第一次写socket游戏,放服务器后怎么调都调不了.
后来在网上搜到方法是在socket第一次访问的时候收到"<policy-file-request/>"这个头消息就把策略xml返回给swf.问题虽然是解决,不过每次连接socket的时候都要判断一次,种感觉浪费这个性能去判断...
这两天心血来潮又花了些时间研究.总算知道为什么crossdomain.xml没用了.flash要连接socket数据就必须从xmlsocket拿安全策略文件.要连接http就必须从http://拿策略文件.
难怪之前放来放去连来连去都无果.如果觉得每次多一个判断不爽的话可以再建一个新的socket app,用另一个端口,专门用于发策略文件.以下是我搜到的一个java类
import java.net.Socket;
import java.net.ServerSocket;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class XMLServer {
public void start() throws Exception {
String xml = "<cross-domain-policy>";
xml = xml + "<allow-access-from domain=\"*\" to-ports=\"*\" />";
xml = xml + "</cross-domain-policy>";
ServerSocket serverSocket = new ServerSocket(5000);
while (true) {
try {
// 新建一个连接
Socket socket = serverSocket.accept();
System.out.println("连接成功......");
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
PrintWriter pw = new PrintWriter(socket.getOutputStream());
// 接收用户名
char[] by = new char[22];
br.read(by, 0, 22);
String head = new String(by);
System.out.println("消息头:" + head + ":");
if (head.equals("<policy-file-request/>")) {
pw.print(xml + "\0");
pw.flush();
}
/*
* else { ServerThread thread = new ServerThread(socket);
* thread.start(); }
*/
} catch (Exception e) {
System.out.println("服务器出现异常!" + e);
}
}
}
public static void main(String[] args) {
try {
new XMLServer().start();
} catch (Exception e) {
System.out.println("socket异常:" + e);
}
}
}
客户端也两段代码搞定
Security.allowDomain("*");
var policy:String = "xmlsocket://192.168.101.2:5000";
Security.loadPolicyFile(policy);
浙公网安备 33010602011771号