do { sendServer(paramString + "\r\n"); p("状态码:"+readReply()); i = readReply(); } while (i == FTP_TRY_AGAIN); p("try"+i); return i;
}
不知道为什么 就是不能登录 但是可以连接到服务器 192.168.1.104 21 open server1 open server2 220 Serv-U FTP Server v11.2 ready...[220 Serv-U FTP Server v11.2 ready... ] Anonymous331 USER Anonymous sun.net.ftp.FtpProtocolException: Error reading FTP pending reply at COM.XHB.FTP.EXTCLASS.Client.issueCommand(Client.java:155) at COM.XHB.FTP.EXTCLASS.Client.login(Client.java:442) at COM.XHB.FTP.FTP_Client_Frame.linkButtonActionPerformed(FTP_Client_Frame.java:527) at COM.XHB.FTP.FTP_Client_Frame.access$4(FTP_Client_Frame.java:491) at COM.XHB.FTP.FTP_Client_Frame$10.actionPerformed(FTP_Client_Frame.java:286) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 状态码:3 try3 EPSV ALL sun.net.ftp.FtpProtocolException: Error reading FTP pending reply at COM.XHB.FTP.EXTCLASS.Client.issueCommand(Client.java:155) at COM.XHB.FTP.EXTCLASS.Client.openPassiveDataConnection(Client.java:223) at COM.XHB.FTP.EXTCLASS.Client.openDataConnection(Client.java:305) at COM.XHB.FTP.EXTCLASS.Client.list(Client.java:520) at COM.XHB.FTP.FTP_Client_Frame.linkButtonActionPerformed(FTP_Client_Frame.java:529) at COM.XHB.FTP.FTP_Client_Frame.access$4(FTP_Client_Frame.java:491) 另外这是 状态码和我自己写的调试方法static { FTP_SUCCESS = 1; FTP_TRY_AGAIN = 2; FTP_ERROR = 3; nonProxyHostsPool = null; nonProxyHostsSource = null; } public static void p(Object o){ System.out.println(o); }
输出和login函数的内容也贴一下。你现在是卡在login那里?
对啊 郁闷 马上贴代码 public void login(String paramString1, String paramString2) throws IOException { // if (serverIsOpen()) p(serverIsOpen()); // if (!(serverIsOpen())){ // p("ss"); // throw new FtpLoginException("not connected to host");} // if ((paramString1 == null) || (paramString1.length() == 0)) // return; // if (issueCommand("USER " + paramString1) == FTP_ERROR){ // p(FTP_ERROR); // throw new FtpLoginException("user " + paramString1 + " : " + getResponseString());}
没有extends或implements,@Override的annotation不合法
我看了一下sun.net.ftp.FtpClient 里面没有那几个方法啊 好奇怪
// Implementation of methods is not availablepackage sun.net.ftp.impl;public class FtpClient extends sun.net.ftp.FtpClient { private static boolean isASCIISuperset(java.lang.String s) throws java.lang.Exception { /* compiled code */ } private void getTransferSize() { /* compiled code */ } private void getTransferName() { /* compiled code */ } private int readServerResponse() throws java.io.IOException { /* compiled code */ } private void sendServer(java.lang.String s) { /* compiled code */ } private java.lang.String getResponseString() { /* compiled code */ } private java.util.Vector<java.lang.String> getResponseStrings() { /* compiled code */ } private boolean readReply() throws java.io.IOException { /* compiled code */ } private boolean issueCommand(java.lang.String s) throws java.io.IOException { /* compiled code */ } private void issueCommandCheck(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } private java.net.Socket openPassiveDataConnection(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } private java.net.Socket openDataConnection(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } private java.io.InputStream createInputStream(java.io.InputStream inputStream) { /* compiled code */ } private java.io.OutputStream createOutputStream(java.io.OutputStream outputStream) { /* compiled code */ } protected FtpClient() { /* compiled code */ } public static sun.net.ftp.FtpClient create() { /* compiled code */ } public sun.net.ftp.FtpClient enablePassiveMode(boolean b) { /* compiled code */ } public boolean isPassiveModeEnabled() { /* compiled code */ } public sun.net.ftp.FtpClient setConnectTimeout(int i) { /* compiled code */ } public int getConnectTimeout() { /* compiled code */ } public sun.net.ftp.FtpClient setReadTimeout(int i) { /* compiled code */ } public int getReadTimeout() { /* compiled code */ } public sun.net.ftp.FtpClient setProxy(java.net.Proxy proxy) { /* compiled code */ } public java.net.Proxy getProxy() { /* compiled code */ } private void tryConnect(java.net.InetSocketAddress inetSocketAddress, int i) throws java.io.IOException { /* compiled code */ } private java.net.Socket doConnect(java.net.InetSocketAddress inetSocketAddress, int i) throws java.io.IOException { /* compiled code */ } private void disconnect() throws java.io.IOException { /* compiled code */ } public boolean isConnected() { /* compiled code */ } public java.net.SocketAddress getServerAddress() { /* compiled code */ } public sun.net.ftp.FtpClient connect(java.net.SocketAddress socketAddress) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient connect(java.net.SocketAddress socketAddress, int i) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } private void tryLogin(java.lang.String s, char[] chars) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient login(java.lang.String s, char[] chars) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient login(java.lang.String s, char[] chars, java.lang.String s1) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public void close() throws java.io.IOException { /* compiled code */ } public boolean isLoggedIn() { /* compiled code */ } public sun.net.ftp.FtpClient changeDirectory(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient changeToParentDirectory() throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public java.lang.String getWorkingDirectory() throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient setRestartOffset(long l) { /* compiled code */ } public sun.net.ftp.FtpClient getFile(java.lang.String s, java.io.OutputStream outputStream) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public java.io.InputStream getFileStream(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public java.io.OutputStream putFileStream(java.lang.String s, boolean b) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient putFile(java.lang.String s, java.io.InputStream inputStream, boolean b) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient appendFile(java.lang.String s, java.io.InputStream inputStream) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient rename(java.lang.String s, java.lang.String s1) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient deleteFile(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient makeDirectory(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient removeDirectory(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient noop() throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public java.lang.String getStatus(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public java.util.List<java.lang.String> getFeatures() throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient abort() throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient completePending() throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient reInit() throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient setType(sun.net.ftp.FtpClient.TransferType transferType) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public java.io.InputStream list(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public java.io.InputStream nameList(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public long getSize(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public java.util.Date getLastModified(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient setDirParser(sun.net.ftp.FtpDirParser ftpDirParser) { /* compiled code */ } public java.util.Iterator<sun.net.ftp.FtpDirEntry> listFiles(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } private boolean sendSecurityData(byte[] bytes) throws java.io.IOException { /* compiled code */ } private byte[] getSecurityData() { /* compiled code */ } public sun.net.ftp.FtpClient useKerberos() throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public java.lang.String getWelcomeMsg() { /* compiled code */ } public sun.net.ftp.FtpReplyCode getLastReplyCode() { /* compiled code */ } public java.lang.String getLastResponseString() { /* compiled code */ } public long getLastTransferSize() { /* compiled code */ } public java.lang.String getLastFileName() { /* compiled code */ } public sun.net.ftp.FtpClient startSecureSession() throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient endSecureSession() throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient allocate(long l) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient structureMount(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public java.lang.String getSystem() throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public java.lang.String getHelp(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ } public sun.net.ftp.FtpClient siteCmd(java.lang.String s) throws sun.net.ftp.FtpProtocolException, java.io.IOException { /* compiled code */ }
}实现代码没有必要贴出了(字数限制省略了一些无关的东西),重点看一下这个包不是sun.net.ftp,那个包里的只是一个抽象类,而这个是实现类,是在sun.net.ftp.impl里面。我不知道你原来问题里面的代码是哪里来的,但是JDK里面这个FtpClient,那些比如说readServerResponse之类的方法是private,而noop这个方法(也就是我之前试过没有问题的方法)是存在于sun.net.ftp.FtpClient里面的public方法,可以被重写。要解决你的问题,你只能自己实现那些方法,或者直接用impl包里的FtpClient了
this.binary();
}这是一个无限递归啊另外我贴的那个FTPClient里面的setType方法应该类似于binary方法要实现的东西
FTP服务器你可以下载一个servU,最简单了
private void linkButtonActionPerformed(java.awt.event.ActionEvent evt) {
try {
//String str="ftp://";
String server =serverTextField.getText(); // 获取服务器地址
System.out.println(serverTextField.getText());
if (server == null) {
return;
}
String portStr = portTextField.getText(); // 获取端口号
if (portStr == null) {
portStr = "21";
}
int port = Integer.parseInt(portStr.trim());
p(portStr);
userStr = userTextField.getText(); // 获取用户名
p(userStr);
if(userStr.equals("") && checkboxes.isSelected())
{userStr="Anonymous";}
else{ userStr=userStr.trim();}
passStr = PassField.getText(); // 获取密码
p(passStr);
if(passStr.equals("")&& checkboxes.isSelected()){
passStr="331";
}
else{
passStr=passStr.trim();
}
cutLinkButton.doClick();
client = new Client();
p("open server1");
client.openServer(server.trim(), port); // 连接服务器
p("open server2");
p(client.getResponseString());
p(client.getResponseStrings());
p(userStr+ passStr);
client.login(userStr, passStr); // 登录服务器
p(client.list());
client.binary(); // 使用二进制传输模式
if (client.serverIsOpen()) { // 如果连接成功
CUT_LINK_ACTION.setEnabled(true); // 设置断开按钮可用
} else { // 否则
CUT_LINK_ACTION.setEnabled(false); // 设置断开按钮不可用
return; // 并结束事件处理
}
// 设置本地资源管理面板的FTP连接信息
localPanel.setFtpClient(server, port, userStr, passStr);
// 设置上传按钮可用
localPanel.getActionMap().get("uploadAction").setEnabled(true);
ftpPanel.setFtpClient(client);// 设置FTP资源管理面板的FTP连接信息
// 设置下载按钮可用
ftpPanel.getActionMap().get("downAction").setEnabled(true);
ftpPanel.refreshCurrentFolder();// 刷新FTP资源管理面板的当前文件夹
queuePanel.startQueue(); // 启动任务队列线程
} catch (Exception ex) {
ex.printStackTrace();
}
}
protected int issueCommand(String paramString)
throws IOException
{
int i;
this.command = paramString;
p(paramString);
do
{
if ((this.replyPending)){
p((!(this.replyPending)));
this.replyPending = false;
}
}
while (readReply() != FTP_ERROR);
try {
throw new FtpProtocolException("Error reading FTP pending reply\n");
} catch (FtpProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
do
{
sendServer(paramString + "\r\n");
p("状态码:"+readReply());
i = readReply();
}
while (i == FTP_TRY_AGAIN);
p("try"+i);
return i;
}
192.168.1.104
21
open server1
open server2
220 Serv-U FTP Server v11.2 ready...[220 Serv-U FTP Server v11.2 ready...
]
Anonymous331
USER Anonymous
sun.net.ftp.FtpProtocolException: Error reading FTP pending reply at COM.XHB.FTP.EXTCLASS.Client.issueCommand(Client.java:155)
at COM.XHB.FTP.EXTCLASS.Client.login(Client.java:442)
at COM.XHB.FTP.FTP_Client_Frame.linkButtonActionPerformed(FTP_Client_Frame.java:527)
at COM.XHB.FTP.FTP_Client_Frame.access$4(FTP_Client_Frame.java:491)
at COM.XHB.FTP.FTP_Client_Frame$10.actionPerformed(FTP_Client_Frame.java:286)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
状态码:3
try3
EPSV ALL
sun.net.ftp.FtpProtocolException: Error reading FTP pending reply at COM.XHB.FTP.EXTCLASS.Client.issueCommand(Client.java:155)
at COM.XHB.FTP.EXTCLASS.Client.openPassiveDataConnection(Client.java:223)
at COM.XHB.FTP.EXTCLASS.Client.openDataConnection(Client.java:305)
at COM.XHB.FTP.EXTCLASS.Client.list(Client.java:520)
at COM.XHB.FTP.FTP_Client_Frame.linkButtonActionPerformed(FTP_Client_Frame.java:529)
at COM.XHB.FTP.FTP_Client_Frame.access$4(FTP_Client_Frame.java:491)
另外这是 状态码和我自己写的调试方法static
{
FTP_SUCCESS = 1;
FTP_TRY_AGAIN = 2;
FTP_ERROR = 3;
nonProxyHostsPool = null;
nonProxyHostsSource = null;
}
public static void p(Object o){
System.out.println(o);
}
对啊 郁闷 马上贴代码
public void login(String paramString1, String paramString2)
throws IOException
{
// if (serverIsOpen()) p(serverIsOpen());
// if (!(serverIsOpen())){
// p("ss");
// throw new FtpLoginException("not connected to host");}
// if ((paramString1 == null) || (paramString1.length() == 0))
// return;
// if (issueCommand("USER " + paramString1) == FTP_ERROR){
// p(FTP_ERROR);
// throw new FtpLoginException("user " + paramString1 + " : " + getResponseString());}
// if ((this.lastReplyCode == 331) && (((paramString2 == null) || (paramString2.length() == 0) || (issueCommand("PASS " + paramString2) == FTP_ERROR))))
// throw new FtpLoginException("password: " + getResponseString());
if((issueCommand("USER " + paramString1) ==331)&&(issueCommand("PASS " + paramString2) ==230)){
p((issueCommand("USER " + paramString1) ==331)&&(issueCommand("PASS " + paramString2) ==230));
StringBuffer localStringBuffer = new StringBuffer();
p(localStringBuffer);
for (int i = 0; i < this.serverResponse.size(); ++i)
{
String str = (String)this.serverResponse.elementAt(i);
p(str);
if (str != null)
{
p(str);
if ((str.length() >= 4) && (str.startsWith("230")))
str = str.substring(4);
localStringBuffer.append(str);
p(str);
}
}
this.welcomeMsg = localStringBuffer.toString();
p(welcomeMsg);
this.loggedIn = true;
}
}前面的让我注掉了
try {
throw new FtpProtocolException("Error reading FTP pending reply\n");
} catch (FtpProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
只要一退出循环就会丢一个异常,估计是这个原因
sun.net.ftp.FtpLoginException: user xhb : 421 Connection timed out - closing.
USER xhb
331 User name okay, need password.
这是服务器端的信息
(issueCommand("USER " + paramString1) ==331)&&(issueCommand("PASS " + paramString2) ==230)
前半句执行了而后半句没有执行,就超时了。原因应该是你的issueCommand里面有死循环,或者死锁。再看看死在哪里了吧
do
{
sendServer(paramString + "\r\n");
p("状态码:"+readReply());
i = readReply();
}
while (i == FTP_TRY_AGAIN);
p("try"+i);
return i;
// do
// {
// }
// while (readReply() != FTP_ERROR);
// try {
// throw new FtpProtocolException("Error reading FTP pending reply\n");
// } catch (FtpProtocolException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
这是那个方法下的2个while循环 但是不知道怎么死锁的
你贴出的代码我注掉了 现在用的是原来的代码 if (issueCommand("USER " + paramString1) == FTP_ERROR){
p(FTP_ERROR);
throw new FtpLoginException("user " + paramString1 + " : " + getResponseString());}
this.lastReplyCode == 331
如果成立,那问题多半是在issueCommand里。看看为什么PASS命令没有发出来。另外不要把你自己设的状态码和服务器端返回的状态码搞混了
(this.lastReplyCode == 331)false悲剧了
怎么debug?? 我是菜鸟另外断点 怎么设置呢
如果最小化再还原就变黑,那就不要最小化。。
protected int issueCommand(String paramString)
throws IOException
{
label37: int i;
this.command = paramString;
do
{
if (!(this.replyPending))
break label37;
this.replyPending = false;
}
while (readReply() != FTP_ERROR);
throw new FtpProtocolException("Error reading FTP pending reply\n");
do
{
sendServer(paramString + "\r\n");
i = readReply();
}
while (i == FTP_TRY_AGAIN);
return i;
}这段代码的标签有问题 请教