[AS3]XMLSocket通讯的安全策略设置

贫嘴的鱼的博客  Thu, 10 Apr 2008 23:25:49 +0800     阅读(101)
如蒙转载,请注明文章出处: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方法了







源文件下载

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1954407


热门关键字  
鏁呬簨   鍙板竵   澶栨眹鏀跨瓥  
閲戣   閫氬悜璐㈠姟鑷   i6.com  
https;//www3.g   通向财务自由之路   吴迪  
trading   strategies   Quantitative  
金融材料   金融   北大  
房价   波斯王子3   风险  
何志成   大专预估分   保证金炒汇  
套息交易   格鲁吉亚   俄罗斯卢布  
俄罗斯金融风暴   货币交易   货币战争  
保尔森   外汇新规   外汇管理条例  
交易汇率   货币政策   金融风暴  
空头结利   欧系货币   对冲基金  
卢布   歌剧故事賞析   歌剧故事  
平均线作用   期权交易员   保荐人  
星川原   技术分析   布林线