Flex Socket 安全沙箱问题

公司是做视频监控的,我负责WEB监控端,web端是用纯FLEX写的,后台是C++,交互用Socket套接字
刚开始直接通过Flash Builder运行可以连接到Socket服务端,后来尝试着部署到tomcat,但是连不上Socket
由于在tomcat中,flex的一些日志信息根本看不到,最后网上查了下,原来是安全沙箱的问题,由于初学flex,很多不懂
经过一上午找资料,加上和服务端的同事联调,终于搞定了,就是那所谓的9秒的安全策略机制
首先找到的方法就是说在服务端HTTP根目录下放一个crossdomain.xml文件



这个好像是在服务端要有一个web服务器,感觉这个跟Socket好像搭不上边,但是后来想一下,网上都这么说了,试一下,于是在服务端搭一个tomcat服务器,在根目录下
放置这个文件,结果 当然是没用
第二个觉得可行的方法就是当服务端收到这个数据的时候服务端返回策略串给我

String xml = ""; xml = xml + ""; xml = xml + ""; xml = xml + "";

if (head.equals("")) { pw.print(xml + "\0"); pw.flush(); } else { ....... ...... }

这是java,在另外一同事那边运行的,这个方法是可以,欣喜若狂的跟服务端同事说,同事说服务端那边不好改,也不要混到服务端去,因为服务端不止提供给WEB端,PC端,手机端都提供,好吧,令寻办法......
【Flex Socket 安全沙箱问题】重新去整理了下flex socket 关于安全沙箱的知识
首先Flex内部会去请求你指定连接IP主机的843端口是否提供安全策略,这个耗时3秒
如果为提供,则继续检测flex中是否有这句Security.loadPolicyFile("xmlsocket://ip:端口"); 也耗时3秒
还是未提供的话,则检查主机服务端是否有返回策略文件,就是上面说到的第二种方法,耗时3秒
如果都没有,则提示安全策略错误
后来找到这篇文章 ,这篇文章大概就是再开一个843端口,专门用来给falsh发送策略文件
地址:http://ndlas.blog.163.com/blog/static/17571114020116621215469/

/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package jqqq; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author Administrator */ public class C843 {public static void main(String[] args) {ServerSocket ssk = null; try {ssk = new ServerSocket(843); Socket sk = ssk.accept(); PrintWriter pw= new PrintWriter(sk.getOutputStream()); BufferedReader isr = new BufferedReader(new InputStreamReader(sk.getInputStream())); String bd = "\0"; //xml表头可以写也可以不写,后边\0是必须的pw.write(bd); pw.flush(); } catch (IOException ex) { Logger.getLogger(Csocket.class.getName()).log(Level.SEVERE, null, ex); }} }

马上根据这个在同事那边用java写了一个843端口监听,结果哈哈成功了
于是服务端那边就不用改了,在开一843端口的监听,他那边代码我没有,所以就不贴了,跟上面意思差不多,也是返回那个xml串

注意下后面哪个\0,这个是flash这边要用的。还有就是843端口发送完之后,要断开连接




    推荐阅读