弃天笑(soda.C)的专栏

专注于Flash RIA和Flash网络游戏开发

用户操作
[即时聊天] [发私信] [加为好友]
弃天笑ID:sujun10
20938次访问,排名5692(-1)好友7人,关注者29
从事过java应用开发,现在从事flash网络游戏开发
sujun10的文章
原创 34 篇
翻译 4 篇
转载 7 篇
评论 58 篇
弃天笑的公告
我的新blog开张了,以后第一 时间更新的是那个blog了,之后才在这里更新,有兴趣的人可以到那里去看,主要是说Flash RIA和flash游戏的 www.sujun.org
最近评论
FANS8888:xiao18yuan@qq.com
给我发一份吧
hbhjun:我最近也在研究flash网络编程,向你学习QQ441993692
小小菜鸟:这个很不错哇~

有时间给点as和c++的实例教程吧~~:-)
sujun10:没试过,应该要做类似按钮之类的,或者插入html标签
丁仙霖:非常感谢,虽然有些地方,没看懂
文章分类
收藏
    相册
    我的相片
    Flash
    asfox Blog
    弃天笑的小窝
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 [AS3]XMLSocket通讯的安全策略设置收藏

    新一篇: 08年1月会出的作品 | 旧一篇: Flash与JSP留言版全部源码

    如蒙转载,请注明文章出处:www.sujun.org  作者:弃天笑


    当自己的做具有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方法了







    源文件下载

    发表于 @ 2007年12月19日 21:40:00|评论(loading...)|编辑

    新一篇: 08年1月会出的作品 | 旧一篇: Flash与JSP留言版全部源码

    评论

    #songhuanren 发表于2008-04-01 19:51:48  IP: 58.211.28.*
    你好!我有一个问题,当as3用xmlsocket连java的时候,它是先发送<policy-file-request />字符串,成功以后,它会断开,然后重连,这样,其实,一个flash的连接就在java那里产生两个线程,
    不知道你有没有碰到这种情况?
    #sujun10 发表于2008-04-08 11:18:08  IP: 121.8.50.*
    是的,但是你可以在java那里做一下判断,不要每个用户一连接就给他一条线程,这样开销是非常大的
    #wind520 发表于2008-07-19 14:20:22  IP: 222.68.188.*
    安全策略设置问题,服务端我用Delphi写的按你的方法没有解决
    #sujun10 发表于2008-07-20 21:43:00  IP: 59.42.103.*
    是的。最好是设置成为一个独立的服务器,当该IP通过验证之后,就另外建立一个socket去连接服务器
    也就是说,用我这个服务器来通过你的socket安全策略验证
    然后再连接你的服务器,这样就不会出现1楼说的情况

    3楼可以详细地说明情况吗?
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 弃天笑