|
|
|
在AS3中详细讲解XMLSocket通讯的安全策略设置 |
| 时间:2008-04-06 来源:www.sujun.org 作者:弃天笑 点击: |
|
|
核心提示:如果没有通过安全策略的检验,socket时连接不成功.解决这个问题的办法有几种,看具体的情况.一种时加载一个与flash所在位置相同的flash... |
|
当自己的做具有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方法了


源文件下载
|
|
|
|
|
上一篇:手把手教您Flash小型日志信息输出器制作附录源码 下一篇:FLASH与ASP通信原理入门 |
 |
|
版权申明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有。
转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。
特别注意:本站所提供的源文件,电子书,第三软件,如需使用,请与原作者联系,版权归原作者所有,文章若有侵犯作者版权,请与我们联系,我们将立即删除修改。 |
 |
|
|
|
|
 |
|
知识堂分类
|
| |
|