[转载]XMLSocket通讯发送安全策略文件
自己转自己的贴.......... 看到天地会有兄弟问安全策略问题,需要源码,所以就附个简单的上来(验证和登陆都是在同个服务器) 服务器:java, JDK1.6 当做具有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方法了 下面是图片 ![]() 1.JPG ![]() 2.JPG ![]() ![]() [ 本帖最后由 弃天笑 于 2008-3-12 20:29 编辑 ] |