做FTP时遇到的异常,sun.net.ftp.FtpProtocolException: PORT :500 Illegal PORT command, EPSV ALL in effect

ztyxz 2005-12-20 09:50:35
服务器端是 红旗linux5 ,安装的 WebLogic 8,做的Web应用中需要实现FTP上传下载文件.

现在从客户端用IE登陆后,当开始下载文件时,报了一个这样的错误:

sun.net.ftp.FtpProtocolException: PORT :500 Illegal PORT command, EPSV ALL in effect


at sun.net.ftp.FtpClient.openDataConnection(Unknown Source)

at sun.net.ftp.FtpClient.get(Unknown Source)

at FTPOpr.getFile(FTPOpr.java:178)

请问这个该如何解决? 我记得以前这个FTP程序工作的很好的
...全文
3737 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztyxz 2005-12-20
  • 打赏
  • 举报
回复
http://www.longen.org/E-K/detaile-k/FfpExtendOnIPv6.htm


FTP对IPv6和NAT的扩展

1. 介绍

FTP仅仅提供了建立在IPv4上进行数据通信的能力,它基于网络地址是32位这一假设。但是,当IPv6出现以后,地址就比32位长许多了。原来对FTP进行的扩展在多协议环境中有时会失败。我们必须针对IPv6对FTP再次进行扩展。本文主要说明一种在非IPv4上传送信息的方法,我们熟悉的两个FTP命令PORT和PASV通过扩展后,我们称它们为EPRT和EPSV。

2. EPRT命令

EPRT考虑到数据连接的扩展地址问题,扩展地址必须包括网络协议以及网络和传输地址。格式如下:

EPRT<空格><d><网络协议><d><网络地址><d><TCP端口><d>

EPRT后要跟空格,空格后面必须是分隔符<d>,分隔符必须在ASCII的33到126范围之内。推荐使用|,除非它已有它用。网络协议是一个数字,它指出使用的是什么协议。具体数据如下:

1=IPv4;2=IPv6;

网络地址是在指定网络协议下的相应地址,在IPv4和IPv6下地址分别如下格式:

IPv4=132.235.1.2;IPv6=1080::8:800:200C:417A

TCP端口指的是协议在哪一个TCP端口上侦听数据连接。下面是两个EPRT命令的例子:

EPRT |1|132.235.1.2|6275|

EPRT |2|1080::8:800:200C:417A|5282|

第一个命令在TCP端口6275上用IPv4打开主机"132.235.1.2";第二个命令在TCP端口5282上用IPv6打开主机"1080::8:800:200C:417A"。

在接收到合法的EPRT命令后,服务器必须返回200(命令合法)。标准的错误代码500和501已经足够处理大部分错误了,但是还需要一个错误代码,代码522指定服务器不支持请求的网络协议,新错误代码的解释如下:

5yz 交换信息结束

x2z 连接

xy2 扩展端口错误:未知的网络协议

响应的文本部分必须说明服务器运行的协议是什么,响应串的格式如下:

<说明不支持的网络的字符串> \

(协议1,协议2,...,协议n)

上述的数字代码和在括号内的协议信息由软件自动控制接收响应;而在数字代码和'('之间的内容供人类用户处理。其后的协议表中的协议应该以逗号分隔。下面是两个响应串的例子:

Network protocol not supported, use (1)

Network protocol not supported, use (1,2)

3. EPSV命令

EPSV请求服务器在一个数据端口上侦听等待连接,它可以带参数。对它的响应是TCP端口号。响应的格式与EPRT参数的很象。这对实现上有很大的方便。而且响应还留下了网络协议和/或网络地址的空位,可以供以后使用。使用扩展地址进行被动模式的响应码必须是229,对它的解释如下:

2yz 主动完成

x2z 连接

xy9 进行扩展的被动模式

 

响应的格式如下:

 

<指示服务器已经进入初扩展的被动模式> \

(<d><d><d><TCP端口><d>)

包括在括号内的字符串必须是EPRT打开数据连接的端口。具体如上所未,这里就不多说了。数据连接使用的协议必须和控制连接使用的协议和地址一致,下面是响应的一个例子:

Entering Extended Passive Mode (|||6446|)

标准错误代码500和501对EPSV已经足够了。在EPSV命令没有使用参数时,服务器会基于控制连接所使用的协议选择数据连接使用的网络协议。但是在有代理的情况下,这种机制可能不合适。因此客户也需要能够要求一个指定协议。如果服务器返回说明它在指定端口不支持此协议,客户必须发送ABOR(放弃)命令使服务器关闭连接,然后客户再使用EPSV命令要求使用特定的网络协议,具体格式如下:

EPSV<空格><网络协议>

如果请求的网络协议是服务器支持的,那就必须使用此协议;如果不支持,则返回522。最后,EPSV命令可以使用参数"ALL"通过网络地址翻译器,EPRT命令不再使用。下面是例子:

EPSV<空格>ALL

接收到此命令后,服务器要拒绝除了EPSV以外所有建立连接的命令。在下一节我们将详细说明此命令的功能。

4. 命令使用

对于所有在两台相同机器间建立控制和数据连接的FTP传输来说,必须使用EPSV。使用它可以减少通过防火墙和网络地址翻译器(NAT)对效率的影响。有些文章推荐在防火墙后使用被动命令,因此防火墙通常不允许主动连接。在本文中定义的EPSV命令不需要NAT在传输时对网络地址进行改变。如果使用EPRT,NAT必须改变网络地址。如果客户发送了"EPSV ALL"命令,NAT能够将连接变为快速方式,只要再不使用EPRT,就不需要对数据段的数据部分进行改变。如果客户希望进行两路FTP传输,应该使用这条命令,如果后来客户需要建立三种FTP传输,必须新打开了个FTP会话。

5. 安全

基本上看不出这样的扩展对安全会的什么样的影响。

总的来说,这个扩展使FTP协议能够运行在不同的网络协议这上了。
ztyxz 2005-12-20
  • 打赏
  • 举报
回复
谢谢楼上的

剑事 2005-12-20
  • 打赏
  • 举报
回复
可能是因为被动方式的原因吧

http://www.blogjava.net/jfy3d/archive/2005/08/28/11391.html
试试这个
ztyxz 2005-12-20
  • 打赏
  • 举报
回复
客戶端是用APPLET實現的。
ztyxz 2005-12-20
  • 打赏
  • 举报
回复
如果服务器端用Windows2000,也没有问题
ztyxz 2005-12-20
  • 打赏
  • 举报
回复
如果不用程序而是直接从IE上访问,就不存在以上问题

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧