C++ 与 Flash 交互 (策略请求文件问题)
2013-02-26 16:14
281 查看
一、引子是这样的,socket连接失败后需要重连接,只能再new一个新的socket,以前的不好使了。。。
暂时查不到原因,对于IOErrorEvent 和SecurityErrorEvent的派发也不是很清楚。。。
package
{
import flash.display.Sprite;
import flash.net.XMLSocket;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
public class XMLSocketTest extends Sprite
{
private var socket:XMLSocket=new XMLSocket();
public function XMLSocketTest()
{
socket.addEventListener( Event.CONNECT, onConnect );
socket.addEventListener(IOErrorEvent.IO_ERROR,onIOError);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);
socket.connect("192.168.1.100",8888);
}
private function onConnect( event:Event ):void
{
trace( "The send socket is now connected..." );
}
private function onIOError(e:IOErrorEvent):void
{
trace("errorrrrrrrrrrrr");
socket.close();
socket.connect("192.168.1.100",8888);
trace("reconnecting...");
}
private function onSecurityError(e:SecurityErrorEvent):void
{
trace("security error");
}
}
}
如上,在IOError事件里重新进行socket.connect(),貌似这个命令不再执行了,因为trace的时候只出现一次trace信息,另外,即使注释掉socket.close()那行效果也是一样。
二、查找socket安全问题相关资料,提到了一些重要信息:
1.请求crossdomain.xml:
socket在connect时会往服务器843端口发送一个字符串 "<policy-file-request/>"请求crossdomain.xml,3秒后取不到,就会查看自己swf中有没有使用 Security.loadPolicyFile来加载这个文件,如果还是没有,就查看要连接的目标端口有没有这个文件。如果都没有,则会报 securityError
参考Flash Socket通信的安全策略问题 843端口(转载)
解决AS3 Socket编程中最令人头疼的问题
2.另一个错误:
根据上面的资料,我用了第二种:Security.loadPolicyFile("http://www.1.com/crossdomain.xml");不过报了这样的错误:
错误: [strict] 将忽略 http://www.1.com/crossdomain.xml 处的策略文件,因为出现 Content-Type“application/octet-stream” 错误。请访问 http://www.adobe.com/go/strict_policy_files_cn 以解决此问题。
这是因为服务端将xml文件的Content-Type设置成了application/octet-stream:
<mime-mapping>
<extension>xml</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
需要改为:
<mime-mapping>
<extension>xml</extension>
<mime-type>application/xml</mime-type>
</mime-mapping>
参考在flex里使用 loadPolicyFile 配置跨域组策略文件时报错
3.进一步查询得知,加载文件用的安全策略文件和socket通讯用的策略文件在flash player某个版本中,被分开处理了。。。。socket的请求必须要通过端口来获得这个策略文件。原文摘一下:
从一些官方的一些资料中了解了一下。以前的Flash Player无论你采用urlRequest的http请求方式或者xmlsocket socket方式,他们都共用一个安全策略文件。这个策略文件只要你放在主域的目录下就行了。而现在不行了,现在的策略文件如果你使用http请求方式那么需要把策略文件放在目录下面,如果你使用socket请求方式就必须通过socket端口来接收这个策略文件。
对应调用的方式为:
http请求——》Security.loadPolicyFile(“http://www.xxx.com/crossdomain.xml”)
socket或xmlsocket请求——》Security.loadPolicyFile(“xmlsocket://www.xxx.com:port”)
所以上述第二步中用的HTTP请求方式是无效的~
参考Flash Socket通信的安全策略问题 843端口(转载)
socket安全策略的问题
4.加载和socket通信策略文件的分开,具体是在flash player 9.0.124版本(Adobe在08年4月8日放出)。
在我们的socket通信之前,flash会使用一个验证socket来验证这个域的安全,得到回复后断开。然后才会连接我们自己的socket.这方面网上的资料挺多。
参考flex socket安全策略<policy-file
总结Flash XMLSocket 通信问题
暂时查不到原因,对于IOErrorEvent 和SecurityErrorEvent的派发也不是很清楚。。。
package
{
import flash.display.Sprite;
import flash.net.XMLSocket;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
public class XMLSocketTest extends Sprite
{
private var socket:XMLSocket=new XMLSocket();
public function XMLSocketTest()
{
socket.addEventListener( Event.CONNECT, onConnect );
socket.addEventListener(IOErrorEvent.IO_ERROR,onIOError);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);
socket.connect("192.168.1.100",8888);
}
private function onConnect( event:Event ):void
{
trace( "The send socket is now connected..." );
}
private function onIOError(e:IOErrorEvent):void
{
trace("errorrrrrrrrrrrr");
socket.close();
socket.connect("192.168.1.100",8888);
trace("reconnecting...");
}
private function onSecurityError(e:SecurityErrorEvent):void
{
trace("security error");
}
}
}
如上,在IOError事件里重新进行socket.connect(),貌似这个命令不再执行了,因为trace的时候只出现一次trace信息,另外,即使注释掉socket.close()那行效果也是一样。
二、查找socket安全问题相关资料,提到了一些重要信息:
1.请求crossdomain.xml:
socket在connect时会往服务器843端口发送一个字符串 "<policy-file-request/>"请求crossdomain.xml,3秒后取不到,就会查看自己swf中有没有使用 Security.loadPolicyFile来加载这个文件,如果还是没有,就查看要连接的目标端口有没有这个文件。如果都没有,则会报 securityError
参考Flash Socket通信的安全策略问题 843端口(转载)
解决AS3 Socket编程中最令人头疼的问题
2.另一个错误:
根据上面的资料,我用了第二种:Security.loadPolicyFile("http://www.1.com/crossdomain.xml");不过报了这样的错误:
错误: [strict] 将忽略 http://www.1.com/crossdomain.xml 处的策略文件,因为出现 Content-Type“application/octet-stream” 错误。请访问 http://www.adobe.com/go/strict_policy_files_cn 以解决此问题。
这是因为服务端将xml文件的Content-Type设置成了application/octet-stream:
<mime-mapping>
<extension>xml</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
需要改为:
<mime-mapping>
<extension>xml</extension>
<mime-type>application/xml</mime-type>
</mime-mapping>
参考在flex里使用 loadPolicyFile 配置跨域组策略文件时报错
3.进一步查询得知,加载文件用的安全策略文件和socket通讯用的策略文件在flash player某个版本中,被分开处理了。。。。socket的请求必须要通过端口来获得这个策略文件。原文摘一下:
从一些官方的一些资料中了解了一下。以前的Flash Player无论你采用urlRequest的http请求方式或者xmlsocket socket方式,他们都共用一个安全策略文件。这个策略文件只要你放在主域的目录下就行了。而现在不行了,现在的策略文件如果你使用http请求方式那么需要把策略文件放在目录下面,如果你使用socket请求方式就必须通过socket端口来接收这个策略文件。
对应调用的方式为:
http请求——》Security.loadPolicyFile(“http://www.xxx.com/crossdomain.xml”)
socket或xmlsocket请求——》Security.loadPolicyFile(“xmlsocket://www.xxx.com:port”)
所以上述第二步中用的HTTP请求方式是无效的~
参考Flash Socket通信的安全策略问题 843端口(转载)
socket安全策略的问题
4.加载和socket通信策略文件的分开,具体是在flash player 9.0.124版本(Adobe在08年4月8日放出)。
在我们的socket通信之前,flash会使用一个验证socket来验证这个域的安全,得到回复后断开。然后才会连接我们自己的socket.这方面网上的资料挺多。
参考flex socket安全策略<policy-file
总结Flash XMLSocket 通信问题
相关文章推荐
- Flash Socket安全问题的 服务器端代码 策略文件 flash socket
- Flash/ActionScript 解决跨域问题的策略文件crossdomain.xml的写法
- C++与Flash的交互
- c++读取文件及输入到文件的相关问题
- 解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题"
- C++中头文件互相包含问题
- C++多个头文件重复定义变量问题
- C++中头文件相互包含的几点问题
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- 初学C++遇到的引用头文件问题
- 解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题"
- Python与C++数据交互编码问题
- flash跨域策略文件crossdomain.xml配置详解
- C和C++ 读写文件速度问题
- WIN7下的WCF遇到的问题:HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理
- Nginx静态文件响应POST请求,提示405错误问题
- FLASH与JS交互需注意的新问题
- jquery ajax 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- C#与Flash交互问题