解决flash发布为html格式后无法进行socket通信的问题
2008-08-23 15:10
726 查看
1.问题描述:
将flash发布为html格式后,加载页面后,swf无法与服务器进行socket通信。Flash端显
示的错误为:
securityErrorHandler信息: [SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"] |
2.问题原因:
当flash player升级到9.0.115.0之后,当flash文件要进行socket通信的时候,需要向服务
器端获取crossdomain.xml文件。在9.0.115.0之前的版本的flash是可以和socket进行正
常通信的。在升级后的版本后,就出现客户端无法连接服务器的现象。
3.flash发起socket通信的过程
当封装在页面的flash发起socket通信请求的时候会先寻找服务器端的843端口,获取
Crossdomain.xml文件,当服务器没有开启843的时候,flash会通过Security.loadPolicyFile
Security.loadPolicyFile("xmlsocket://192.168.1.100:844"); Security.loadPolicyFile("http://192.168.1.100:844"); |
1)首先检测目标服务器的843端口是否提供安全策略。
2) 如果1没有检测到策略,则检测actionscript是否使用了
Security.loadPolicyFile(“xmlsocket://”) 手 段提供安全策略,
如果还没检测到,则使用第3步检测。
3)检测目标服务器目标端口是否提供安全策略。
4.解决办法。
根据在页面flash发起socket的过程,我们可以寻找解决问题的办法,首先简单的办法,就是在服务器端编写好一个Crossdomain.xml文件,等待客户机的读取。客户端读取的时候就是按上面所说的办法来进行读取,但是这个测试我一直没有测试成功,所以就不多说了,如果谁测试成功了,希望能指点一下,下面我主要是介绍一下我的解决办法,思路如下:
1)在服务器端启动843端口,当客户端进行连接的时候,首先会向843端口发送<policy-
file-request/>信息来请求服务器来发送Crossdomain.xml的内容,注意此时发送的
是一个字符串数据,而不是一个xml文本,后面的代码示例中我会详细介绍。
2)当服务器接收到有客户端发送的<policy-file-request/>请求时,就会立即回复一
个包含有Crossdomain.xml配置信息的字符串。
3)Java代码如下:
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class SecurityXMLServer implements Runnable { private ServerSocket server; private BufferedReader reader; private BufferedWriter writer; private String xml; public SecurityXMLServer() { String path = "policyfile文件路径"; //此处的换成相应的读取xml文档的方式如dom或sax //xml = readFile(path, "UTF-8"); /** 注意此处xml文件的内容,为纯字符串,没有xml文档的版本号 */ xml="<cross-domain-policy> " +"<allow-access-from domain=/"*/" to-ports=/"1025-9999/"/>" +"</cross-domain-policy> "; System.out.println("policyfile文件路径: " + path); System.out.println(xml); //启动843端口 createServerSocket(843); new Thread(this).start(); } //启动服务器 private void createServerSocket(int port) { try { server = new ServerSocket(port); System.out.println("服务监听端口:" + port); } catch (IOException e) { System.exit(1); } } //启动服务器线程 public void run() { while (true) { Socket client = null; try { //接收客户端的连接 client = server.accept(); InputStreamReader input = new InputStreamReader(client.getInputStream(), "UTF-8"); reader = new BufferedReader(input); OutputStreamWriter output = new OutputStreamWriter(client.getOutputStream(), "UTF-8"); writer = new BufferedWriter(output); //读取客户端发送的数据 StringBuilder data = new StringBuilder(); int c = 0; while ((c = reader.read()) != -1) { if (c != '/0') data.append((char) c); else break; } String info = data.toString(); System.out.println("输入的请求: " + info); //接收到客户端的请求之后,将策略文件发送出去 if(info.indexOf("<policy-file-request/>") >=0) { writer.write(xml + "/0"); writer.flush(); System.out.println("将安全策略文件发送至: " + client.getInetAddress()); } else { writer.write("请求无法识别/0"); writer.flush(); System.out.println("请求无法识别: "+client.getInetAddress()); } client.close(); } catch (Exception e) { e.printStackTrace(); try { //发现异常关闭连接 if (client != null) { client.close(); client = null; } } catch (IOException ex) { ex.printStackTrace(); } finally { //调用垃圾收集方法 System.gc(); } } } } //测试主函数 public static void main(String[] args) { new SecurityXMLServer(); } } |
<?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="服务器允许的客户端的域名或Ip(可以指定范围)" to-port=“服务器允许客户端访问的端口”/> </cross-domain-policy> |
2008,和2000--4000的端口,我们就可以这样配置。
<?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="www.toplx.com,192.168.1.2-192.168.210" to-port="2008,2000-4000"/> <!---如果想让所有的客户端访问服务器,则配置成如下 <allow-access-from domain="*" to-port="2008,2000-4000"/> --> </cross-domain-policy> |
相关文章推荐
- java和vb进行socket通信以及java与c/c++/oc 进行socket通信时汉字字符串编码问题解决
- Unity(C#.net)网络通信问题解决(服务器开启失败,Socket下的“由于目标机器积极拒绝,无法连接”异常)
- 关于安卓手机做客户端pc做服务器进行Socket通信出现问题的解决案方
- python的subprocess无法进行通信(无法通过管道输入数据)的问题解决
- 解决Struts2整合jasperreport,输出格式为HTML时页面图片无法找到问题
- 解决SharePoint无法上传HTML格式文件问题
- java和vb进行socket通信以及java与c/c++/oc 进行socket通信时汉字字符串编码问题解决
- Struts2下进行html转义的方法(解决页面输出html标签问题)
- “在使用Samba进行建立Wisamba无法访问,你可能没有权限使用网络”的一种问题原因及解决
- 解决 asp.net 伪静态 IIS设置后 直正HTML无法显示的问题
- 解决用<img src="<%# Eval("ShowPhoto")%>"动态绑定图片,发布到IIS上无法显示的问题
- 解决:无法在 Web 服务器上启动调试。与 Web 服务器通信时出现身份验证错误。请参阅“帮助”以协助解决问题。
- VS2010无法调试问题解决 最近,因为公司开发的需要,对开发环境进行全面的升级,在这其中也遇到了不少问题,在之后将陆续整理出来,以便以后查看。 之前开发环境:VS2008,ArcGIS9.3,Ar
- Ubuntu 下网页flash问题解决办法--flash无法播放,中文方块字
- VS2005 SP1发布,解决只能创建WebSite,无法创建Web Application项目的问题
- [笔记].怎样解决gcc无法编译UTF-8格式的C文件的问题
- 绿化flash无法编写代码的问题解决
- selenium对未在屏幕展示范围内的元素进行操作时,出现元素无法定位的问题解决
- java与c/c++进行socket通信的一些问题
- 在ASP中用VBS对汉字进行网址编码解决FLASH图表的中文乱码问题