9RIA.com天地会 - 论坛

返回列表 发帖

天地培训

9RIA天地会官方培训机构

Adobe官方认证培训中心

[代码] [AS3]XMLSocket通讯发送安全策略文件

自己转自己的贴..........

看到天地会有兄弟问安全策略问题,需要源码,所以就附个简单的上来(验证和登陆都是在同个服务器)

服务器:java,  JDK1.6

                                                当做具有socket服务器的flash社区或者游戏时,就会牵涉到flash的安全策略的问题
如果没有通过安全策略的检验,socket时连接不成功.
解决这个问题的办法有几种,看具体的情况.一种时加载一个与flash所在位置相同的flash,该flash连接服务器
另外的一种时连接上服务器后,接受服务器的策略文件,通过再继续通讯.具体可以参考官方的flash.system.Security类

下面我列出我写的解决程序,我是直接把配置文件写进服务器里(主要这里时做个例子,简单起见,事实上服务器去读xml都可以)

现看下服务端全部代码:
/*
* $Id: XMLServer.java $
*
* @author  soda.C sujun10@21cn.com
* @version  1.0
* <br>Copyright 2005-2006 The SDK-I Studio
* <br>This program is protected by copyright laws.
* <br>Program Name:
* <br>Date:
*/

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=\"127.0.0.1\" to-ports=\"5000,8080\" />";
                xml = xml + "<allow-access-from domain=\"localhost\" to-ports=\"5000,8080\" />";
                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);
                }
               
        }
}


在类中,
定义了一个xml格式字符传
String xml = "<cross-domain-policy>";
                xml = xml + "<allow-access-from domain=\"127.0.0.1\" to-ports=\"5000,8080\" />";
                xml = xml + "<allow-access-from domain=\"localhost\" to-ports=\"5000,8080\" />";
                xml = xml + "</cross-domain-policy>";



//接收用户名
                                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();
                                }
这里是根据客户端第一次传过来的字符串进行判断,是登陆请求还是安全策略请求


接着看客户端部分代码


public function TestXMLSocket()
                {
                        System.useCodePage = true;
                        socket = new XMLSocket();
                        socket.addEventListener( Event.CONNECT, onConnect );
                        socket.addEventListener( IOErrorEvent.IO_ERROR , failConnect );
                        socket.addEventListener( DataEvent.DATA, onDatas );

                        sendBtn.addEventListener(MouseEvent.MOUSE_DOWN,sendEvent);
                        socket.connect("10.0.108.166", 5000);
                }

                public function onConnect(myStatus:Event):void
                {
                        msgText.text = msgText.text + "连接成功\n";
                        //立即发送成功 信息到服务器
                        socket.send("<policy-file-xxquest/>\n");
                }

可以看到,当连接成功后,马上发送一个判断字符串
这是因为使用指定的端口建立连接后,Flash Player 立即传送 <policy-file-request />,并以 null 字节结束
服务器发送一个空字节来终止策略文件,并可以随后关闭该连接;如果服务器不关闭该连接,则 Flash Player 在收到终止 null 字节后也会这样做。
当客户端得到权限后,就会自动再次与服务器连接,接着就会响应onConnect方法了

下面是图片


1.JPG


2.JPG





[ 本帖最后由 弃天笑 于 2008-3-12 20:29 编辑 ]
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
3

评分人数

  • KingFo_HZ

  • 清水

  • oliwen

KingFo_HZ 赐本贴 银子 + 10  诏曰: 非常棒!
清水 赐本贴 银子 + 10  诏曰: 自己转自己的也是原创哦!支持!^^ ...
oliwen 赐本贴 威望 + 1 银子 + 5  诏曰: 看在 自己转自己的贴..........的份上,加分^ ...

天地人才库
版主动作真快.............
呵呵,趁着快下班,溜达溜达

TOP

不错不错~~~~鼓励以后多转点自己的东西哦~~~~~~~~
呵呵~~~~~~~~~是啊~~


楼主有没放在不同的服务器上测试下,有没解决安全沙箱的问题~~~~~~我记得我以前那样测试的时候始终不能解决安全沙箱的问题~后来没法,都只能读一个服务器上的资源了~

[ 本帖最后由 oliwen 于 2008-1-14 17:43 编辑 ]
自信的一笑!
个人AS博客: http://oliwen.blog.163.com

TOP

好兄弟,讲义气!---by eko

踏上天地会荣耀之路!

 

申请舵主

加入掘金队

加入译林军

知识专题整理

 

咨询(QQ):

1442604479(小地)

 

看不懂,不过老同事还是帮顶一个,呵呵。
走进AS 3.0的殿堂之路......

TOP

真的非常感谢弃天笑同志,:),这次应该能够成功了

TOP

支持!
看贴不回贴就是没公德!兄弟~~,做人要厚道!

TOP

原帖由 xiefeng7758 于 2008-1-14 17:37 发表
看不懂,不过老同事还是帮顶一个,呵呵。


哈哈 最喜欢要来来一窝的~!!
等等,我在吃饭.哦,还没洗脸,迟到了?别急!还有半个小时才来公交!

TOP

其实在本机测试就可以了
如果你在本机建立了web服务器
你的socket连接是什么IP,你在web输入什么IP就没有提示安全策略文件
但是如果你输入其他IP,就提示要了
例如
你socket连接是你的电脑IP  192.168.2.22
那么你的web这样输入http://192.168.2.22/flash,swf是不用安全策略的
但是你输入http://127.0.0.1/flash,swf却需要安全策略,否则提示连接不上
有用java的,可以把代码下载去试试看,我测试过的,呵呵

TOP

灌水灌水灌水灌水灌水灌水灌水灌水灌水灌水

TOP

XMLSocket.fla打不开的?可否把fla的代码放出来,多谢!

TOP

可以打开的,fla是用flash CS3搞的,必须用CS3来打开

TOP

多谢!
http://www.cnzz.name/show/2222

上面的页面说:“loadPolicyFile() 來取得 XMLSokcet 的開啟權限。但是這個動作在 flash player 9.0.115 卻有問題~ ”

是不是真的,郁闷!

TOP

貌似不行,我曾经试过.....
直接用socket服务器发是可以解决的
如果不想该原来的socket服务器的网络结构
可以另外用一个socket服务器来发送策略文件.
即IP相同,但是端口不一样

TOP

弃大侠,XMLSocket.fla中XMLSocket连接的代码封装了,可否发代码到我邮箱:ziwuxian126@126.com,或者
在这说说思路,多谢!
我自己写的,测了很久都不成功,用您的例子测试也不成功,可能是改不了连接的Ip地址。

我自己测的代码如下:
System.security.loadPolicyFile("xmlsocket://127.0.0.1:5000");
// 创建 XMLSocket 对象
var theSocket:XMLSocket = new XMLSocket();
// 使用 connect() 方法连接到站点上大于 1024 的空闲端口。
// 输入 localhost 或 127.0.0.1 进行本地测试。
// 对现场服务器,输入您的域 www.yourdomain.com
theSocket.connect("127.0.0.1", 5000);//这个端口换过另外一个也不行,安全策略里也加了
// 显示关于连接的文本
theSocket.onConnect = function(myStatus) {
        if (myStatus) {
                conn_txt.text = "connection successful";
        } else {
                conn_txt.text = "no connection made";
        }
};

TOP

哦,不好意思,是我疏忽了......那个类没有打包进去
现在已经重新传上去了.麻烦去下载吧

TOP

返回列表