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);