解决方案 »

  1.   

    public  class FtpClient{
    没有extends或implements,@Override的annotation不合法
      

  2.   

    继承了FTPClient  也不好使  不知道为什么
      

  3.   

    extends sun.net.ftp.FtpClient试试,我这里没问题
      

  4.   


    我看了一下sun.net.ftp.FtpClient 里面没有那几个方法啊  好奇怪
      

  5.   

    有几个方法是有的,有几个方法是在另外一个包里的FtpClient:  // IntelliJ API Decompiler stub source generated from a class file
      // 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了
      

  6.   

    你说的那个包我看了一下  没有binary方法  openServer方法  还有好多没有的方法  
      

  7.   

    谁知道能用的FTP服务器?求个做测试客户端  谢谢啦
      

  8.   

    public synchronized void binary() throws IOException {
            this.binary();
        }这是一个无限递归啊另外我贴的那个FTPClient里面的setType方法应该类似于binary方法要实现的东西
    FTP服务器你可以下载一个servU,最简单了
      

  9.   


    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;
       
      }
      

  10.   

    不知道为什么  就是不能登录  但是可以连接到服务器
    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);
    }
      

  11.   

    输出和login函数的内容也贴一下。你现在是卡在login那里?
      

  12.   


    对啊  郁闷  马上贴代码
    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;
        }
      }前面的让我注掉了  
      

  13.   

    在issueCommand函数里,有一句这个:
        try {
            throw new FtpProtocolException("Error reading FTP pending reply\n");
        } catch (FtpProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    只要一退出循环就会丢一个异常,估计是这个原因
         
      

  14.   

    其实。。我也没写过FTP程序。。只是根据你贴的代码找一些显而易见的问题而已另一个提示是你看看服务器端有什么反应,我觉得issueCommand这个函数很可疑,怎么是先读reply再sendServer呢?
      

  15.   

    嗯  很感谢  按照你说的 我调了一下  如下错误  
    sun.net.ftp.FtpLoginException: user xhb : 421 Connection timed out - closing.
      

  16.   

    220 Serv-U FTP Server v11.2 ready...
    USER xhb
    331 User name okay, need password.
    这是服务器端的信息
      

  17.   

    这个意思就是说,你的USER命令服务器收到了,但是PASS没有收到。也就是说这一句:
    (issueCommand("USER " + paramString1) ==331)&&(issueCommand("PASS " + paramString2) ==230)
    前半句执行了而后半句没有执行,就超时了。原因应该是你的issueCommand里面有死循环,或者死锁。再看看死在哪里了吧
      

  18.   


     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循环  但是不知道怎么死锁的  
      

  19.   


    你贴出的代码我注掉了  现在用的是原来的代码  if (issueCommand("USER " + paramString1) == FTP_ERROR){
         p(FTP_ERROR);
          throw new FtpLoginException("user " + paramString1 + " : " + getResponseString());}
      

  20.   

    原来的程序看上去没有问题。设置断点一步步检查吧。关键是下面这行是否成立:
    this.lastReplyCode == 331
    如果成立,那问题多半是在issueCommand里。看看为什么PASS命令没有发出来。另外不要把你自己设的状态码和服务器端返回的状态码搞混了
      

  21.   


    (this.lastReplyCode == 331)false悲剧了
      

  22.   

    嘛。。这样debug的方向就有了
      

  23.   


    怎么debug?? 我是菜鸟另外断点  怎么设置呢
      

  24.   

    那设断点,就是双击某一行,然后用debug模式运行程序。这世界上还有其他开发程序比如说IntelliJ比如说NetBeans
      

  25.   

    窗口最小化在还原就变黑了  why?
      

  26.   

    这个我真的不知道了。。我一开始也使用eclipse,后来实在是太不稳定了换成了IntelliJ
    如果最小化再还原就变黑,那就不要最小化。。
      

  27.   


    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;
      }这段代码的标签有问题  请教
      

  28.   

    label放到do 前面。话说这里也不需要label啊