[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方法了
源文件下载
当自己的做具有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 的策略文件问题