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

Posted 弃天笑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[AS3]XMLSocket通讯的安全策略设置相关的知识,希望对你有一定的参考价值。

如蒙转载,请注明文章出处: 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方法了







源文件下载

以上是关于[AS3]XMLSocket通讯的安全策略设置的主要内容,如果未能解决你的问题,请参考以下文章

ActionScript 3 XMLSocket 的策略文件问题

XMLSocket 在 Firefox 中工作,但不在 IE 中

AS3、xmlSocket 和编码

阿里云服务器专用网络安全组怎么设置

[AS3]Flash Socket底层接受数据的初级处理

AS3 沙箱