我正在尝试评估Flex是否可以访问二进制套接字。似乎有一个类calles Socket(flex.net包)。要求是Flex将连接到服务二进制数据的服务器。然后,它将订阅数据并接收它将解释的Feed并显示为图表。我从未使用过Flex,我的经验在于Java,所以对我来说一切都是新的。所以我想快速设置一些简单的东西。 Java服务器需要以下内容:
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,需要连接到localhost: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可以执行二进制客户端 - 服务器应用程序,但我个人在执行此操作时缺乏一些基本知识。
我在IntelliJ IDEA IDE中使用Flex 3.5。
感谢任何帮助。
谢谢!
答案 0 :(得分:1)
我可以确认Flex可以访问二进制套接字。但是,你已经看到了一个烦恼。它将首先尝试连接到主机上的端口843以获取策略文件,并查看是否允许连接。但是,如果该连接超时(并且它只允许3秒钟来获得答案),它将连接到服务器端口并请求策略文件(通过发送&lt; policy-file-request /&gt;)。它读取结果,如果连接被认为是可接受的,它再次连接到服务器以进行“真实”协议。
除非保证843上的策略文件服务器能够快速响应,否则Flex应用程序总是有可能在服务器端口上发出策略文件请求。这是现有服务的真正部署问题,但如果您自己设置服务器则不会太糟糕,在这种情况下,您只需要确保可以合理地区分策略文件请求与协议的任何初始启动。 / p>
我发回的政策文件看起来像这样:
<?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:\ Users \ George \ AppData \ Roaming \ Macromedia \ Flash Player \ Logs“中:
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);