峰之博纹 - Pelephone个人博客

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



posted @ 2011-11-29 17:23  Pelephone  阅读(1846)  评论(0编辑  收藏  举报