`
lixinye0123
  • 浏览: 332226 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

Flash XMLSocket 通信问题总结

    博客分类:
  • Flex
阅读更多
 原文:http://blog.csdn.net/SCUM/archive/2008/10/21/3118175.aspx

1、前言
  本文以标准两层 C/S 架构为例,对 XMLSocket 通信编程作一沉痛总结。
  从开始到调试正常耗掉了我几乎一周的时间,故为沉痛!尚东!!真是太尚东了!!!

 

  为方便描述,把 Flash Player 称作客户端(Client),包括独立的 Player 和嵌入浏览器的 Player。

 

2、用途
  XMLSocket 类提供以 TCP/IP 方式进行程序间通讯的功能。


3、开发基本流程
  流程无所谓,先做服务端也好,先做客户端也罢,都不可能把一边做完再做另一边,总之是要同步进行,除非服务端已经存在。

 

4、客户端开发
  XMLSocket 类使用比较简单,基本上就是几个步骤:

 

  1) 创建 XMLSocket 类的实例。
  2) 写好需要响应的事件代码,事件很少,如下:
    onConnect: Socket 成功连接后触发,传入一个参数,指定连接状态
    onClose: 服务器端断开 Socket 后触发
    onData: 收到服务端数据,或传输错误时触发,传入一个参数,为 undefined 时表示传输错误,否则为收到的数据
    onXML: 收到服务端 XML 内容,或传输错误时触发,参数同 onData

    典型的代码片段如下:
    ...
    var g_Socket = new XMLSocket();
    g_Socket.onConnect = ge_OnConnect;
    g_Socket.onClose = ge_OnDisconnect;
    g_Socket.onData = ge_OnData;
    ...


  3) 通过调用 connect( 服务端地址或IP, 服务端口 ) 方法发起连接请求。
  4) 连接若成功,数据的收发处理就由自己决定了。

 

5、服务端开发
  服务端根据情况可选各种语言开发,如 Java/C++/C#,只要能处理 Socket 的就行。
  个人感觉,开发前期可用 C++/单线程,输出和调试都方便,等通信层稳定后,可考虑用 Java 实现管理逻辑,在线程安全、垃圾回收、锁等方面,Java 都比 C++ 来得方便。

 

  根据应用的不同,服务端的具体实现千变万化,但基本的工作原理和内容是类似的:
  1) 初始化内部数据
  2) 开始监听端口
  3) 处理连接请求
  4) 管理会话(Session)
  5) 管理线程
  6) 收集和分发数据
  7) 实现业务逻辑
  再展开来还有网络连接池、数据连接池、线程池、交互锁等。

 

6、沙箱和安全策略问题
  此问题发生在连接时,准确地说是连接前,分别两种情况:

 

  6.1.1、本地播放
    本地播放时,默认情况下 Flash Player 将不允许 swf 访问任何网络。
    访问 http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html,将 swf 加入到许可列表,即可解除限制。

 

  6.1.2、WEB 发布
    发布在 WEB 上的 swf, 将可能面临跨域的问题。

    Flash 中的通信方式有两种:
    1) HTTP 方式:如 URLLoader 等用于加载远程 swf、文件、图像、音视频流。
    2) Socket 主要:如 XMLSocket,用于与远程服务端建立长效连接。

 

    Flash Player 6 以上版本引入了安全策略文件,在进行正式的通信前,会检查目标位置是否存在合法的安全策略,以防止不同域内的应用无限制任意互访。

 

    HTTP 方式下,Flash Player 会检查目标域根目录下是否存在 crossdomain.xml,如果有,则获取并分析其内容(内容后述)以确定是否允许继续访问。

    Socket 方式下,Flash Player 获取安全策略稍微复杂些,从 9.0.115.0 版起,标准步骤如下(以下描述以 IE 为标准,例外情况后述):
    1) 首先向目标主机 843 端口发起连接,并发送一个字符串,内容为 "<policy-file-request/>",并等待返回安全策略文件并分析。
    2) 若 1) 失败,则检查 AS 代码中是否使用了 Security.loadPolicyFile( "xmlsocket://主机:端口" ) 方法加载安全策略文件,若有,则获取并分析。
    3) 若 2) 失败,则向 AS 代码中即将连接的 "目标主机:端口" 发起请求,过程同 1)。
    4) 若成功获得安全策略文件并经分析认为允许建立连接,则继续执行 Connect() 方法,此时方真正尝试创建与目标主机的连接。

 

  6.1.3、解决方案
    了解了上面说到的问题,解决方案便呼之欲出了,HTTP 连接方式不用再说,只说说 Socket 方式。
    1) 在服务端写一个程序,监听 843 端口,当收到 "<policy-file-request/>" 时将恰当的策略内容(crossdomain.xml)发送回客户端。
    2) 在 AS 中通过 loadPolicyFile() 加载策略文件,此处需注意使用 xmlsocket:// 而不是 http://。
    3) 在标准服务端口中,检测到 "<policy-file-request/>" 时,返回策略内容。

 

  6.1.4、例外情况及测试结果
    经测试发现,在 IE, Opera 中,Flash Player 会严格按上述步骤检查安全策略。
    在 FireFox, Chrome 中发起连接时,Flash Player 并不会向服务端发送 "<policy-file-request/>",而是直接连接成功。这应该是 Flash Player 不同实现版本的原因。

 

7、数据传输中的问题
  在 XMLSocket 数据传输中,需要注意以下细节,否则会出来些莫名其妙的问题。

 

  7.1、结束符号
    XMLSocket 接收到服务端下发的数据时,将连续放于接收缓冲区,直到接收到 "\0" 字节(字节内容为 ASCII 值 0),才认为接收完成,并调用相应的 onData 或 onXML 事件。
    服务端若用 Java 编写,并使用标准的 String 类族,则在发送数据结尾应手动加上 "\0"。
    若用 C++ 编写,由于 C++ 中标准字符串类型便是以字节 0 作结束标记,故不必再加 "\0"。
    * C++ 中需注意另一个问题,若自行进行了字符串处理,在决定字符串长度时,标准的 strlen 及 String.Length() 等返回的均是实际有效字符个数,最终向网络发送时,总长度应加 1 字节,以容纳结尾的字节 0。
    * 此问题在发送安全策略内容时同样存在,故需重视。

 

  7.2、中文问题
    默认情况下,不管从哪一端发向另一端的数据,若包含了中文字符,都会产生乱码的现象,解决方法有二:
    1) 在 AS 中加入 "System.useCodepage = true;" 强制使用本地代码集,此法最方便,但是在跨语种平台上仍会出现乱码。
    2) 在代码中自行编写转码函数,此法复杂些,但通用性强。具体转码算法网上很多,主要是 C++ 服务端需要,Java 中使用 JDK 类转换为 UTF-8 即可。


分享到:
评论
1 楼 tangrub 2009-11-29  
       

相关推荐

    FLASH通过XMLSocket与VB后台通信代码

    - 由于Flash的XMLSocket通信是基于TCP/IP的,可能会受到防火墙和安全策略的影响。开发者需要确保通信的合法性,并考虑如何处理可能的安全问题。 7. **跨域问题**: - 默认情况下,Flash有同源策略限制,不能与...

    flash中的XMLSocket 类

    **XMLSocket类**是在Flash Player 5中引入的一个重要类,主要用于实现实时客户端/服务器通信。该类通过客户端套接字实现了计算机之间的通信,使得运行Flash Player的客户端能够与服务器进行交互。 #### 二、...

    flash XMLSocket java 通信(采用服务器推技术 解决了乱码 )

    本文将深入探讨如何使用XMLSocket在Flash与Java之间进行高效、稳定的数据交换,并且特别关注如何解决在通信过程中可能出现的中文乱码问题。 首先,XMLSocket是Flash中的一个类,它提供了基于TCP/IP的双向通信功能,...

    flash actionscript3游戏开发之as3的socket通信方式介绍即使用XMLSocket.zip

    总之,AS3中的XMLSocket是实现Flash游戏网络通信的关键工具,开发者需要理解其安全机制和连接过程,以确保在各种环境下的稳定性和兼容性。同时,合理设计数据传输协议和错误处理策略,对于提高游戏体验和降低网络...

    flash与服务器端通信

    二、XMLSocket通信 XMLSocket是基于TCP/IP的实时通信方式,它创建一个持久的连接,允许Flash客户端与服务器之间实时发送和接收数据。使用XMLSocket,开发者可以直接操作二进制数据流,灵活性高,但需要处理更多的...

    javascript xmlsocket 即时通讯客户端源码

    总结,JavaScript XMLSocket是实现即时通讯的一种技术,虽然现在WebSocket已经更先进,但在某些场景下,XMLSocket仍然是一个有效的解决方案。理解和掌握XMLSocket的原理和实现,有助于我们更好地应对各种实时通信的...

    解决xmlsocket 需要的843端口

    XMLSocket是一种基于XML的数据传输协议,常用于实时通信,如Flash中的Socket连接。在Web应用中,如果使用了XMLSocket,通常需要开放特定的端口,例如843...只有正确处理这些方面,才能确保XMLSocket通信的顺利进行。

    java与flash通信.pdf

    在XMLSocket通信中,服务器同样需要有相应的Socket通信逻辑来解析和响应XML消息。 最后,文档中提到的使用OCR扫描技术产生的错误和遗漏需要我们有意识地进行修正和理解。由于OCR技术的局限性,识别出的代码可能存在...

    flash策略文件

    综上所述,这个压缩包包含了一个完整的Flash XMLSocket通信示例,从客户端的Flash应用程序到服务器端的Java程序。通过学习这个实例,开发者可以了解如何在Flash中实现低延迟的实时通信,以及如何处理跨域策略文件以...

    Flashcs3.Flex与asp.php通信总结包含数据库

    1. **XMLSocket通信**:这是一种实时的双向通信方式,允许Flash客户端与服务器端通过套接字直接建立连接,实现数据的即时传输。在ASP.NET或PHP中,可以创建一个监听特定端口的服务,接收并处理来自Flash的XML消息。 ...

    java与flash通信.docx编程资料

    在Flash中,AS1和AS2版本通过`XMLSocket`类实现通信,而AS3则使用更高级的`Socket`类。 ##### 3.1 Java服务器端实现 下面是一个简单的Java服务器端实现示例: ```java import java.io.*; import java.net.*; ...

    Flash 与 html及C#程序通讯

    总结来说,Flash与HTML及C#程序的通信是通过多种机制实现的,包括External Interface、Web服务和WebSocket。随着技术的发展,现代Web开发更多地依赖于HTML5的新特性,但对Flash的理解和熟练运用仍对处理特定场景的...

    C# Flash做的WebQQ程序

    总结起来,"C# Flash做的WebQQ程序"是一个结合了C#和Flash技术的Web应用,利用C#构建后端服务,Flash处理前端交互,通过XMLSocket实现即时通讯。对于想了解或学习此类技术的开发者来说,可以尝试分析程序的工作流程...

    java_and_flash.rar_flash java_java flash

    4. **XMLSocket**: 类似于Socket通信,XMLSocket提供了基于XML的二进制数据流通信,适合传输结构化数据,但现在已经不再推荐使用,因为其已被Flash Player的WebSocket API取代。 5. **AMF (Action Message Format)*...

    FLASH AS3 SOCKET收发16进制示例

    在IT行业中,Flash AS3是一种广泛用于创建交互式应用程序、游戏和富互联网应用...了解这些概念和技巧对于开发需要实时通信的Flash应用程序至关重要。记住,安全性和性能优化也是使用Socket通信时不可忽视的重要因素。

    flash网游基础通讯(FMS,JAVA)

    3. XMLSocket通信:提供类似Socket的API,但数据格式固定为XML,方便跨平台交互。 在实际项目中,Java可能作为后端服务器处理复杂的业务逻辑和数据存储,而Flash负责用户界面和轻量级的逻辑。它们通过API接口进行...

    flash连接数据库示例

    XMLSocket是Flash与服务器进行实时双向通信的手段。通过创建XMLSocket对象,设置主机名和端口号,然后打开连接,就可以发送和接收数据。在发送数据时,通常会构造一个包含SQL查询的XML文档,服务器解析后执行查询,...

    as和后台通讯 URLLoader(URLStream) FlashRemoting XMLSocket(Socket) FMS/FCS

    - XMLSocket 类提供了一种基于TCP/IP的双向通信,允许Flash与服务器进行实时的、低延迟的数据交换。 - 它可以用于创建聊天应用、在线游戏等需要实时交互的应用。 - XMLSocket 通常用于与服务器端进行二进制或文本...

    ardunio连接FLASH

    在这种情况下,XMLSocket 是一种关键的通信手段,允许 Flash 通过 TCP/IP 协议与外部世界进行数据交换。 XMLSocket 提供了全双工的通信通道,意味着数据可以在两个方向上同时传输。然而,由于安全限制,Flash 只能...

    asp与flash通讯

    2. **XMLSocket通信**: Flash支持通过XMLSocket类建立TCP套接字连接,这允许与服务器进行实时双向通信。在ASP端,可以创建一个监听特定端口的服务,接收并处理Flash发送的数据。 3. **XML数据交换**: 另一种常见...

Global site tag (gtag.js) - Google Analytics