很抱歉主题行听起来像是一个更书呆子的哈利波特标题。
我正在尝试使用 AS3 的 Socket 类编写一个简单的 FTP 程序,以在 Flex Builder 3 中导出为 AIR 应用程序。我正在使用本地网络上的 FTP 服务器来测试程序。我可以成功连接到服务器(简单的部分),但我无法发送任何命令。我很确定您必须使用 ByteArray 类来发送这些命令,但是我显然遗漏了一些关键信息。有谁知道如何做到这一点?谢谢!戴夫
很抱歉主题行听起来像是一个更书呆子的哈利波特标题。
我正在尝试使用 AS3 的 Socket 类编写一个简单的 FTP 程序,以在 Flex Builder 3 中导出为 AIR 应用程序。我正在使用本地网络上的 FTP 服务器来测试程序。我可以成功连接到服务器(简单的部分),但我无法发送任何命令。我很确定您必须使用 ByteArray 类来发送这些命令,但是我显然遗漏了一些关键信息。有谁知道如何做到这一点?谢谢!戴夫
FTP 协议早于 UTF 编码。切换到 ANSI/ASCII 以获得更好的结果。如果您确实选择了 writeMultiByte 而不是 writeUTFBytes,请注意它在 linux 中存在错误。这是解决它的一种方法。
这里还有一个问题,行尾是罪魁祸首,所以请确保你做对了(如上所述)。
如前所述,如果这是从 Web 运行的,则所有套接字连接都需要跨域策略,但这不是基于 HTTP 的文件。最近对安全规则的更改意味着任何基于套接字的连接必须首先从托管在目标主机端口 843 上的策略服务器获取跨域。
引自 Adobe:
如果没有套接字策略文件,SWF 文件可能不再与自己的域建立套接字连接。在版本 9,0,115,0 之前,SWF 文件可以在没有策略文件的情况下在其自己的域中建立与端口 1024 或更大端口的套接字连接。
HTTP 策略文件可能不再用于授权套接字连接。在版本 9,0,115,0 之前,从 /crossdomain.xml 在端口 80 的主位置提供的 HTTP 策略文件可用于授权与同一主机上任何端口 1024 或更高端口的套接字连接。
本质上,这意味着您必须控制目标 FTP 主机,并在其上安装补充软件才能使其正常工作。
我已经能够让 FTP 客户端在浏览器中工作,但它有问题。我必须在端口 843 上运行一个侦听器来为策略文件提供服务,以便允许 Flash 连接和传输数据。然后,我必须弄清楚 FTP 的实际工作原理:
您必须打开 2 个套接字:一个命令套接字和一个数据套接字。命令套接字是您发送 USER、PASS、CWD 和 STOR 命令的地方。数据套接字是您将 ByteArray 数据写入的位置。发送 PASV 命令将告诉您数据套接字必须连接到哪个端口。
在 Mac 上,在 Safari 和 FF 中,当我调用“socket.close()”命令时,服务器套接字实际上会关闭。在 Windoze 上,它没有。这是一个大问题,因为在服务器关闭连接之前不会触发 Event.CLOSE 事件。这是在 livedocs 中。
这就是我所在的地方。我不知道为什么它会在 Mac 上完美运行,然后在 Windows 上的 3 种不同浏览器中完全崩溃。我唯一能想到的是,它要么是我的 Windows 配置中的某些东西阻止了与服务器的正常通信,要么是 Window Flash 播放器导致了问题。
有什么想法吗?
你 100% 确定语法是正确的吗?我知道对于 HTTP,您必须在请求通过后包含额外的换行符。没有它,您将一无所获。不知道它是如何与FTP虽然。
我们需要更多信息来解决这个问题。你在这里说的对我来说似乎是正确的。您使用的是 Socket 类来发送数据,而不是 ByteArray。
您确定没有发送数据吗?您如何收到回复?可能是它工作正常,但您只是不知道吗?正如我所说,告诉我们更多关于你在做什么..
Lee Brimelow在 gotoAndLearn上有一个关于编写 POP3 客户端的截屏视频。这与您正在做的事情基本相同,因此请看一下。
根据我收集到的信息,您必须一次发送一个命令并在继续之前验证响应。你应该得到一些反对 ProgressEvent.SOCKET_DATA 的东西
试试这个,看看你会得到什么回应。
socket.writeUTFBytes("USER "+user+"\n"); socket.flush();
然后,您将像这样读出响应。
var response:String = mySocket.readUTFBytes(mySocket.bytesAvailable);
FTP 标准要求在命令末尾使用 CRLF。尝试在您的示例中使用“\r\n”代替“\n”。
您必须从 FTP 服务器提供跨域策略文件才能正确连接。