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