2010-05-17 49 views
0

我试图评估Flex是否可以访问二进制套接字。似乎有一个类调用Socket(flex.net包)。要求是Flex将连接到服务器提供二进制数据。然后它将订阅数据并接收它将解释并显示为图表的订阅源。我从来没有与Flex合作过,我的经验在于Java,所以对我来说一切都是新的。所以我试图快速设置一些简单的东西。 Java服务器期望以下内容:Flex中的二进制套接字和策略文件

DataInputStream in = ..... 
byte cmd = in.readByte(); 
int size = in.readByte(); 
byte[] buf = new byte[size]; 
in.readFully(buf); 
... do some stuff and send binary data in something like 
out.writeByte(1); 
out.writeInt(10000); 
... etc... 

Flex,需要连接到本地主机:6666完成握手并读取数据。我有这样的事情:

 try { 
      var socket:Socket = new Socket(); 

      socket.connect('192.168.110.1', 9999); 
      Alert.show('Connected.'); 
      socket.writeByte(108); // 'l' 
      socket.writeByte(115); // 's' 
      socket.writeByte(4); 
      socket.writeMultiByte('HHHH', 'ISO-8859-1'); 
      socket.flush(); 
     } catch (err:Error) { 
      Alert.show(err.message + ": " + err.toString()); 
     } 

首先,Flex做了<policy-file-request/>。我修改了服务器以回应:

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd"> 

<cross-domain-policy> 
    <site-control permitted-cross-domain-policies="master-only"/> 
    <allow-access-from domain="192.168.110.1" to-ports="*" /> 
</cross-domain-policy>  

之后 - EOFException发生在服务器上,就是这样。

所以问题是,我接触到Flex的整个流数据问题是错误的吗?我是否发送政策文件错误?不幸的是,我似乎无法找到一个很好的例子来说明如何去做。在我看来,Flex可以执行二进制Client-Server应用程序,但我个人缺乏一些基本知识。

我在IntelliJ IDEA IDE中使用Flex 3.5。

任何帮助表示赞赏。

谢谢!

回答

1

我可以确认Flex可以访问二进制套接字。但是,你已经看到了一个烦恼。它将首先尝试连接到主机上的端口843以获取策略文件并查看是否允许连接。但是,如果连接超时(并且它只允许3秒钟获得答案),它将连接到服务器端口并请求策略文件(通过发送<策略文件请求/ >)。它读取结果,并且如果连接被认为是可接受的,则它再次连接到服务器以经历“真实”协议。

除非843上的策略文件服务器保证快速响应,否则Flex应用程序总是会在服务器端口上发出策略文件请求。这对于现有服务来说是一个真正的部署问题,但是如果您自己设置服务器,则不会那么糟糕,在这种情况下,您只需确保可以将策略文件请求与协议的任何初始启动进行合理区分。

我已经发回策略文件看起来是这样的:

<?xml-version="1.0"?> 
<cross-domain-policy> 
    <allow-access-from domain="*" to-ports="1492"/> 
</cross-domain-policy> 

你看起来八九不离十保存对站点控制标签,我不认为这是相关的。

什么是非常有用的是启用策略文件请求的日志记录,您可以了解Flex是什么。以下是我在Vista机器上的操作方法;路径在XP下会有所不同,但我希望至少这个描述能为你提供网页搜索条件。

首先,安装Flash播放器的调试版本。

通过将启用日志记录:

ErrorReportingEnable=1 
TraceOutputFileEnable=1 
PolicyFileLog=1 
#PolicyFileLogAppend=1 # optional but possibly useful 

在C:/Users/George/mm.cfg

现在你应该看到两个文件出现在C:\用户\乔治\应用程序数据\漫游\的Macromedia \ Flash播放器\日志“:

flashlog.txt 
policyfiles.txt 

policyfiles.txt是你想看看,看看什么样的政策文件,被检索和Flex决定如何回应他们的一个的flashlog.txt是非常有用的,太。 ,因为捕获trace()输出,但是您可能会从IDE获得该输出。

还有一件事。将事件侦听器添加到套接字对于帮助区分I/O类型错误与安全策略违例非常有用。以下是我正在侦听的事件:

socket.addEventListener(Event.CONNECT, ServerConnect); 
socket.addEventListener(Event.CLOSE, ServerClose); 
socket.addEventListener(IOErrorEvent.IO_ERROR, ServerIOError); 
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, ServerSecurityError); 
+0

您可以在使用Security.loadPolicyFile方法加载策略文件时指定端口。我在这里写了一篇文章http://cornelcreanga.com/2008/11/bringing-data-into-flex-applications-introduction/ – 2010-05-17 18:28:42

+0

谢谢!这工作。它连接好。现在我要弄清楚如何在Flex中读取异步套接字中的数据。 Flex有免费的实时消息协议吗?我看到他们提供了一个商业解决方案,但我可以以某种方式免费做到这一点吗? – Daniil 2010-05-17 19:08:56