总结Flash XMLSocket 通信问题

总结Flash XMLSocket 通信问题

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 即可。
转载自http://www.flash-home.com/article/818.html

转载于:https://www.cnblogs.com/iImax/archive/2011/01/08/1930636.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110669.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • BatchNorm2d原理、作用及其pytorch中BatchNorm2d函数的参数讲解

    BatchNorm2d原理、作用及其pytorch中BatchNorm2d函数的参数讲解BN原理、作用:函数参数讲解:BatchNorm2d(256,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True)1.num_features:一般输入参数为batch_sizenum_featuresheight*width,即为其中特征的数量,即为输入BN层的通道数;2.eps:分母中添加的一个值,目的是为了计算的稳定性,默认为:1e-5,避免分母为0;3.momentum:一个用于运行过程中均值和方差的一个估

    2022年6月10日
    51
  • xgboost原理分析以及实践

    xgboost原理分析以及实践摘要本文在写完GBDT的三篇文章后本来就想写的,但一直没有时间,终于刚好碰上需要,有空来写这篇关于xgboost原理以及一些实践的东西(这里实践不是指给出代码然后跑结果,而是我们来手动算一算整个xgboost流程)由于网上已经许多优秀的文章对xgboost原理进行了详细的介绍,特别是xgboost作者陈天奇的论文以及slide已经非常完整阐述了整个xgboost的来龙去脉,现有的文章基本也…

    2022年6月6日
    76
  • Vue(10)表单输入绑定v-model「建议收藏」

    Vue(10)表单输入绑定v-model「建议收藏」v-modelv-model指定可以实现表单值与属性的双向绑定。即表单元素中更改了值会自动的更新属性中的值,属性中的值更新了会自动更新表单中的值绑定的属性和事件v-model在内部为不同的输入元

    2022年7月29日
    11
  • php工厂模式使用场景[通俗易懂]

    php工厂模式使用场景[通俗易懂]场景:使用工厂模式接入:阿里短信验证、腾讯短信验证、百度短信验证创建类文件BaseSMS.php–基础短信服务接口类AliSMS.php–阿里短信服务类BaiduSMS.php–百度短信服务类TencentSMS.php–腾讯短信服务类SmsBusiness.php–短信业务逻辑类具体代码BaseSMS.php–基础短信服务接口类interfaceBaseSMS{publicstaticfunctionsendCode($phone,$co

    2022年7月25日
    23
  • 使用Ubuntu搭建Web服务器

    使用Ubuntu搭建Web服务器Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app),更重要的是容器性能开销极低。总而言之,Docker相当于在你的电脑上建了一个虚拟机…

    2022年5月28日
    30
  • c#正则表达式定义「建议收藏」

    c#正则表达式定义「建议收藏」正则表达式(regularexpression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。  列目录时, dir*.txt或ls*.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。  正则表达式是由普通字符(例如字符a到z)以及特殊字符(称为元字符)组成的文

    2025年7月1日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号