1、C+与 Flex 之间 socket 通信 policy-file-request 解决方案C+winsocket 服务端,Flex as3 客户端。服务端 Bind 绑定 IP127.0.0.1端口 2020,在 Flex 中使用 Socket.connect 向服务器发起链接。当Flex 在本 地运行的时候能链接成功, 但是通过域名访问时出现Security 错误, Error #2048 。并且在连接时, 服务端收到客户端发来的消息 消息。 尝试解决: 上 google 搜索了若干资料,我看了良久也一知半解。 出现这个问题的原因是 FlashPlayer 有一个安全沙箱机制 。本地运行s
2、wf 时,flashPlayer 默认的安全策略是可以跨预访问的,可以查看Security.sandboxType 属性值为 localTrusted。然而在使用 IP 访问swf 文件时,flashPlayer 会认为这个文件是不安全的此时可以查看 Security.sandboxType 的属性值为 remote。此时需要在服务端放置策略文件,flashPlayer 才会让 swf 链接到此服务器。 若干人的博客上都说需要名为 crossdomain.xml 的文件放置到服务端HTTP 的根目录下。文件内容为 view plaincopy to clipboardprint?1. 2. 3
3、. 4. 5. 我这么做了,但是没有任何效果。(我能确定策略文件被访问到了,因为文件中出现语法错误的时候 Flex 调试信息中还会报出警告。)于是我猜想这个方法也许是解决不能访问远程 HTTP 文件的的问题,而socket 通信需要另外的方法。 然后在 CSDN 论坛上发现有人用 JavaSocket 和 Flex 通信出现同样问题,解决方案是服务端收到 消息时,直接向客户端发送一条消息,内容就是上面的策略文件的 xml 。我仿照做了,依然无效_“); 3. strcat_s(szPolicy, 1024, “); 4. strcat_s(szPolicy, 1024, “); 5. strc
4、at_s(szPolicy, 1024, “); 6. strcat_s(szPolicy, 1024, “0“); 7. sockClient = m_sockListener.Accept( 8. if (sockClient.IsInvalid() 9. 10. / accept failed 11. puts(“# Error! Acceptation failed.“); 12. continue; 13. 14.nRecvLen = sockClient.Receive(szRecvBuff, MAX_BUFF); 15.if (sockClient.IsDisconnect()
5、16. 17. / disconnect 18. printf_s(“# Disconnect client%d.n“, i); 19. RemoveClient(m_vsockClientsi-); 20. continue; 21. 22.szRecvBuffnRecvLen = 0; 23.printf_s(“# Received: %d%sn“, nRecvLen, szRecvBuff); 24.if (0 = strcmp(“, szRecvBuff) 25. 26. if (strlen(szPolicy) = sockClient.Send(szPolicy, strlen(s
6、zPolicy) 27. 28. printf_s(“# Send policy xml string successful.n“); 29. 30. else 31. 32. printf_s(“# Error! Send policy xml string failed.n“); 33. 34. /sockClient.Close(); /*重点在这里* 35. /RemoveClient(m_vsockClientsi-); 36. continue; 37. 38./ Connect successful. char szPolicy1024 = “;strcat_s(szPolicy
7、, 1024, “);strcat_s(szPolicy, 1024, “);strcat_s(szPolicy, 1024, “0“sockClient = m_sockListener.Accept(if (sockClient.IsInvalid() / accept failedputs(“# Error! Acceptation failed.“);continue;nRecvLen = sockClient.Receive(szRecvBuff, MAX_BUFF)if (sockClient.IsDisconnect()/ disconnectprintf_s(“# Discon
8、nect client%d.n“, i);各位就当是伪代码看吧问题解决: 最后问题的解决是看了这位大哥的博客:http:/ 居然用了 goto,让我晃了一下神。 最后的关键点是:在收到并向客户端返回策略文件之后,需要关闭当前的 socket。 原因是请求策略文件的 链接和主动发起的链接是两个独立的链接,也就是说服务端收到信息的链接并不是我们在客户端的 connect 函数的主链接。关闭策略文件的请求连接后,flashPlayer 它会自动重连。这个现象可以在服务端看到,这是我服务端接受一次链接显示 的信息: # Accept successful 127.0.0.1:4106# Readabl
9、e client0.# Received: 23# Send policy xml string successful.# Accept successful 127.0.0.1 :4107 就是这样,收工。 -相关信息: Flash CS3 文档 权限控制概述 http:/ Flash CS3 文档 加载数http:/ 先调用 Security.loadPolicyFile() 方法,然后再调用 Socket.connect() 或 XMLSocket.connect() 如果要实现套接字服务器,并且需要提供套接字策略文件,则应决定是使用接受主连接的同一端口提供策略文件,还是使用不同的端口来提供策略文件。无论 是哪种情况,服务器均必须等待客户端的第一次传输之后再决定是发送策略文件还是建立主连接。当 Flash Player 请求策略文件时,它始终会在建立连接后传输以下字符串: 服务器收到此字符串后,即会传输该策略文件。程序对于策略文件请求和主连接并不会使用同一连接,因此应在传输策略文件后关闭连接。如果不关闭连接,Flash Player 将关闭策略文件连接,之后重新连接以建立主连接。有关详细信息,请参阅套接字策略文件 。