<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[了解flash发起socket通信的过程及一些安全性问题]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 14 Jul 2010 14:41:39 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	昨天做测试的时候遇到一个问题，做好的SWF在Flash AS3中调试通过，但是发布到html中之后就无法得到数据了。查了一些资料之后找到了解决办法。这里感谢 剑心 提供帮助，以及同事若水三千提供Java代码及日志记录。<br/><br/>1、问题描述<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将flash发布为html格式后，加载页面后，swf无法与服务器进行socket通信。Flash端显示的错误为：<br/>securityErrorHandler信息: [SecurityErrorEvent type=&quot;securityError&quot; bubbles=false cancelable=false eventPhase=2 text=&quot;Error #2048&quot;]<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在服务器端显示的信息是由客户端尝试进行连接，但是无法接受数据。接受的数据显示为空。<br/><br/>2.问题原因：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最新的Flash player 9.0.124.0，当flash文件要进行socket通信的时候，需要向服务器端获取crossdomain.xml文件。如果找不到就出现客户端无法连接服务器的现象。<br/><br/>了解flash发起socket通信的三个过程<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当封装在页面的flash发起socket通信请求的时候会先寻找服务器端的843端口，获取Crossdomain.xml文件，当服务器没有开启 843的时候，flashPlayer会检查发起请求的swf文件中中有没有使用Security.loadPolicyFile来加载策略文件 Crossdomain.xml，如果还是没有就会看这个发起请求的swf要连接的目标端口有没有策略文件。如果都没有那么连接失败,返回如上的出错提 示。<br/><br/>为什么老版本的Flash player没有这个问题？<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从一些官方的一些资料中了解了一下。以前的Flash Player无论你采用urlRequest的http请求方式或者xmlsocket socket方式，他们都共用一个安全策略文件。这个策略文件只要你放在主域的目录下就行了。而现在不行了，现在的策略文件如果你使用http请求方式那 么需要把策略文件放在目录下面，如果你使用socket请求方式就必须通过socket端口来接收这个策略文件。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对应调用的方式为：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http请求——》Security.loadPolicyFile(“http://www.xxx.com/crossdomain.xml”)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket或xmlsocket请求——》Security.loadPolicyFile(“xmlsocket://www.xxx.com：port”)<br/><br/>怎么将Socke策略文件发给Flash Player<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flash Player在你的socket.connect(&quot;domain&quot;,port)运行之前，会按照前面描述的三个过程向你的socket服务器的843端 口（据说Adobe已经向相关管理机构申请保留843端口给Flash Player用）发送一个字符串 &quot;&lt;policy-file-request/&gt;&quot;，这个时候如果你有一个服务在监听843端口那么收到这个字符串之后，直接按照XML格式 发回策略文件就解决了。（注意发回的时候记得加一个截止字符&quot;&#92;0&quot;）<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;当然你也可以不用843端口自己设置一个端口。因为Flash Player如果在843端口得不到信息，就会检查你是否在你的Flash文件里面自己添加了指定的获取通道，你可以定义一个自己的端口。不过这个时候你 不能用http方式，而要用xmlsocket方式。（相当于自动帮你新建了一个xmlsocket对象，然后链接你指定的主机和端口）。比如你想用 1234端口可以在你的Flash里面加这一句 Security.loadPolicyFile(“xmlsocket://www.xxx.com:1234”)，需要注意的是这一句要加在你的 socket.connect前面。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;还有最后一个办法，就是在你的socket连接端口监听这个请求。比如你用的是 socket.connect(&quot;192.168.1.100&quot;,8888),那么在你的服务器加一段接收字符串&quot;&lt;policy-file- request/&gt;&quot;的代码，当接到这个字符串时将策略文家按照xml格式发到客户端。<br/><br/>关于策略文件的格式（可以在Flash CS3帮助里面的Flash Player安全性——》控制权限概述中找到）<br/><br/>1、针对web应用的策略文件<br/><br/>下面的示例显示了一个策略文件，该文件允许访问源自 *.iflashigame.com 和 192.0.34.166 的 SWF 文件。<br/><br/><br/><div class="code">&lt;?xml version=&quot;1.0&quot;?&gt;<br/>&lt;cross-domain-policy&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;allow-access-from domain=&quot;*.iflashigame.com&quot; /&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;allow-access-from domain=&quot;192.0.34.166&quot; /&gt;<br/>&lt;/cross-domain-policy&gt;</div><br/><br/>注意事项：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认情况下，策略文件必须命名为 crossdomain.xml，并且必须位于服务器的根目录中。但是，SWF 文件可以通过调用 Security.loadPolicyFile() 方法检查是否为其它名称或位于其它目录中。跨域策略文件仅适用于从其中加载该文件的目录及其子目录。因此，根目录中的策略文件适用于整个服务器，但是从任 意子目录加载的策略文件仅适用于该目录及其子目录。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;策略文件仅影响对其所在特定服务器的访问。例如，位于 https://www.adobe.com:8080/crossdomain.xml 的策略文件只适用于在端口 8080 通过 HTTPS 对 www.adobe.com 进行的数据加载调用。<br/><br/>2、针对Socket的策略文件<br/><br/><br/><div class="code">&lt;cross-domain-policy&gt; <br/>&nbsp;&nbsp; &lt;allow-access-from domain=&quot;*&quot; to-ports=&quot;507&quot; /&gt; <br/>&nbsp;&nbsp; &lt;allow-access-from domain=&quot;*.example.com&quot; to-ports=&quot;507,516&quot; /&gt; <br/>&nbsp;&nbsp; &lt;allow-access-from domain=&quot;*.example2.com&quot; to-ports=&quot;516-523&quot; /&gt; <br/>&nbsp;&nbsp; &lt;allow-access-from domain=&quot;www.example2.com&quot; to-ports=&quot;507,516-523&quot; /&gt; <br/>&nbsp;&nbsp; &lt;allow-access-from domain=&quot;www.example3.com&quot; to-ports=&quot;*&quot; /&gt; <br/>&lt;/cross-domain-policy&gt;</div><br/><br/>这个策略文件是指定允许哪些域的主机通过那些端口链接。<br/><br/>参考文章<br/><br/>flash xmlsocket policy 问题<br/>Policy file changes in Flash Player 9<br/>Setting up a socket policy file server<br/>Understanding Flash Player 9 April 2008 Security Update compatibility<br/><br/>获取策略文件的Java服务器端代码<br/><br/><br/><div class="code">import java.io.BufferedReader;<br/>import java.io.BufferedWriter;<br/>import java.io.IOException;<br/>import java.io.InputStreamReader;<br/>import java.io.OutputStreamWriter;<br/>import java.net.ServerSocket;<br/>import java.net.Socket;<br/><br/>public class SecurityXMLServer implements Runnable &#123;<br/><br/>&nbsp;&nbsp; private ServerSocket server;<br/>&nbsp;&nbsp; private BufferedReader reader;<br/>&nbsp;&nbsp; private BufferedWriter writer;<br/>&nbsp;&nbsp; private String xml;<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp; public SecurityXMLServer() <br/>&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; String path = &quot;policyfile文件路径&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp; //此处的换成相应的读取xml文档的方式如dom或sax <br/>&nbsp;&nbsp;&nbsp;&nbsp; //xml = readFile(path, &quot;UTF-8&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意此处xml文件的内容，为纯字符串，没有xml文档的版本号<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br/>&nbsp;&nbsp;&nbsp;&nbsp; xml=&quot;&lt;cross-domain-policy&gt; &quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&quot;&lt;allow-access-from domain=&#92;&quot;*&#92;&quot; to-ports=&#92;&quot;1025-9999&#92;&quot;/&gt;&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp; +&quot;&lt;/cross-domain-policy&gt; &quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;policyfile文件路径: &quot; + path);<br/>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(xml);<br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; //启动843端口<br/>&nbsp;&nbsp;&nbsp;&nbsp; createServerSocket(843);<br/>&nbsp;&nbsp;&nbsp;&nbsp; new Thread(this).start();<br/>&nbsp;&nbsp; &#125;<br/><br/>&nbsp;&nbsp; //启动服务器<br/>&nbsp;&nbsp; private void createServerSocket(int port)<br/>&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server = new ServerSocket(port);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;服务监听端口：&quot; + port);<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125; catch (IOException e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.exit(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp; &#125;<br/><br/>&nbsp;&nbsp; //启动服务器线程<br/>&nbsp;&nbsp; public void run()<br/>&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; while (true) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Socket client = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接收客户端的连接<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client = server.accept();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStreamReader input = new InputStreamReader(client.getInputStream(), &quot;UTF-8&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader = new BufferedReader(input);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputStreamWriter output = new OutputStreamWriter(client.getOutputStream(), &quot;UTF-8&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer = new BufferedWriter(output);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //读取客户端发送的数据<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuilder data = new StringBuilder();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int c = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((c = reader.read()) != -1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (c != &#039;&#92;0&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.append((char) c);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String info = data.toString();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;输入的请求: &quot; + info);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //接收到客户端的请求之后，将策略文件发送出去<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(info.indexOf(&quot;&lt;policy-file-request/&gt;&quot;) &gt;=0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.write(xml + &quot;&#92;0&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.flush();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;将安全策略文件发送至: &quot; + client.getInetAddress());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.write(&quot;请求无法识别&#92;0&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.flush();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;请求无法识别: &quot;+client.getInetAddress());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.close();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125; catch (Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //发现异常关闭连接<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (client != null) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.close();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125; catch (IOException ex) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125; finally &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用垃圾收集方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.gc();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp; //测试主函数<br/>&nbsp;&nbsp; public static void main(String&#91;&#93; args)<br/>&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; new SecurityXMLServer();<br/>&nbsp;&nbsp; &#125;<br/>&#125;</div><br/>来源：http://hi.baidu.com/lewutian/blog/item/70b83a642c54ccfbf7365418.html
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 了解flash发起socket通信的过程及一些安全性问题]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>