`
cuixuxucui
  • 浏览: 352925 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

flash socket通讯失败后的事情

 
阅读更多

一、引子是这样的,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 通信问题

分享到:
评论

相关推荐

    嵌入式

    根据给定的文件信息,我们可以总结出嵌入式系统中手机光盘的客户常见问题解决方案,涉及的主题包括:更改手机的开关机动画、待机界面、屏幕保护图片、执行Java程序时的串口问题、Java程序执行问题、Socket通讯问题...

    vc++ 应用源码包_1

    FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了...

    vc++ 应用源码包_2

    FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了...

    vc++ 应用源码包_6

    FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了...

    vc++ 应用源码包_5

    FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了...

    vc++ 应用源码包_3

    FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了...

    赛尔号发包例子以及逆向过程-易语言

    解压后,开始找与通讯的类。一般搜索flash.net.Socke即可==send(param1, param2) #4CAF50==发送数据包的函数 public function send(param1:uint, param2:Array) : uint  {  var loc3_:* = null;  var loc4_:* ...

Global site tag (gtag.js) - Google Analytics