AS3 FTP编程以及Socket和ByteArray类
抱歉,主题行听起来像是一个更加呆板的哈利·波特冠军头衔。
我试图使用AS3的Socket类编写一个简单的FTP程序,以在Flex Builder 3中导出为AIR应用程序。我正在使用本地网络上的FTP服务器来测试该程序。我可以成功连接到服务器(简单的部分),但是无法发送任何命令。我很确定我们必须使用ByteArray类发送这些命令,但是显然我缺少一些关键信息。有谁知道如何做到这一点?谢谢!
戴夫
解决方案
回答
我们将需要更多信息来解决此问题。.我们在这里所说的对我来说似乎是正确的。我们正在使用Socket类来发送数据,而不是ByteArray。
我们确定没有发送数据吗?我们如何收到回复?可能是它工作正常,但我们只是不知道?正如我所说,请告诉我们我们正在做什么的更多信息。
Lee Brimelow的gotoAndLearn上有关于编写POP3客户端的截屏视频。基本上与我们所做的相同,请看一下。
回答
我们是否100%确定语法正确?我知道使用HTTP时,我们必须在请求通过后再添加一个换行符。没有它,我们将一无所有。虽然不确定FTP的情况。
回答
FTP标准在命令末尾要求CRLF。尝试在示例中使用" \ r \ n"代替" \ n"。
回答
我们必须从FTP服务器提供CrossDomain策略文件,以便正确进行连接。
回答
根据我的收集,我们必须一次发送一个命令,并在继续之前验证响应。我们应该针对ProgressEvent.SOCKET_DATA有所收获
试试这个,看看你得到的回应。
socket.writeUTFBytes("USER "+user+"\n"); socket.flush();
然后,我们将像这样读取响应。
var response:String = mySocket.readUTFBytes(mySocket.bytesAvailable);
回答
FTP协议早于UTF编码。切换到ANSI / ASCII,以获得更好的结果。如果我们选择使用writeMultiByte而不是writeUTFBytes,请注意,它在Linux中存在问题。这是解决它的一种方法。
这里还有另一个问题,行尾竟然是罪魁祸首,因此请确保我们设置正确(如上所述)。
如前所述,如果这是从Web运行的,则所有套接字连接都需要跨域策略,但这不是基于HTTP的文件。安全规则的最新更改意味着,任何基于套接字的连接都必须首先从托管在目标主机的端口843上的策略服务器获取跨域。
从Adobe报价:
A SWF file may no longer make a socket connection to its own domain without a socket policy file. Prior to version 9,0,115,0, a SWF file was permitted to make socket connections to ports 1024 or greater in its own domain without a policy file. HTTP policy files may no longer be used to authorize socket connections. Prior to version 9,0,115,0, an HTTP policy file, served from the master location of /crossdomain.xml on port 80, could be used to authorize a socket connection to any port 1024 or greater on the same host.
本质上,这意味着我们必须控制目标FTP主机,并在其上安装辅助软件才能正常工作。
回答
也阅读此链接,也许对这个链接也可能有用。
第一个与策略文件有关,第二个与TELNET客户端(此处没有FTP)有关。
回答
我已经能够在浏览器中使用FTP客户端,但是它有很多问题。我必须让一个侦听器在端口843上运行,以将策略文件存储为服务器,以便允许Flash连接和传输数据。然后,我必须弄清楚FTP的实际工作原理:
我们必须打开2个套接字:一个命令套接字和一个数据套接字。命令套接字是我们发送USER,PASS,CWD和STOR命令的位置。数据套接字是将ByteArray数据写入的地方。发送PASV命令将告诉我们数据套接字必须连接到哪个端口。
在Mac上,无论是在Safari还是FF上,都有很多问题,当我调用" socket.close()"命令时,服务器套接字实际上关闭了。在Windoze上则不行。这是一个很大的问题,因为直到SERVER关闭连接才触发Event.CLOSE事件。这是在livedocs中。
这就是我的位置。我不知道为什么它可以在Mac上完美运行,然后在Windows的3种不同浏览器中完全崩溃。我唯一能想到的是,这是由于Windows配置中的某些东西阻止了与服务器的正常通信,或者是导致问题的Window Flash播放器。
有什么想法吗?