5

Apache ライブラリ (commons.net ver 3.2) の助けを借りて、サーバーから ftp ファイルをダウンロードしています。ダウンロードはうまくいき、必要なファイルをすべて受け取り、フォルダーに保存しました。私が抱えている問題は、ダウンロード中に接続が中断されたときに接続が失われたことを示すエラーメッセージが必要なため、タイムアウトに関するものですが、これを行うのが難しいことがわかりました。これを含む無数のフォーラムを検索しました1人と私はこれを解決するために多くの方法を試しましたが、まだ誰も結果を出していません! 私が持っているコードは次のとおりです。

public void doSomething(String ip, int port, String user, String pass, String server, String remotePath, String localPath) {
  int tenseconds = 10 * 1000;
  int thirtyseconds = 30 * 3000;
  Socket s4 = new Socket();
  java.net.InetSocketAddress adr = new java.net.InetSocketAddress("213.0.17.234", 21);
  s4.connect(adr, thirtyseconds);
  FTPClient client = new FTPClient();

  org.apache.commons.vfs2.FileSystemOptions fileSystemOptions = null;
  String key = FtpFileSystemConfigBuilder.getInstance().getEntryParser(fileSystemOptions);

  try {

    client.setConnectTimeout(tenseconds);
    client.setDefaultTimeout(thirtyseconds);
    client.connect(ip, port);
    client.setSoTimeout(thirtyseconds);

    int reply = client.getReplyCode();
    if (!FTPReply.isPositiveCompletion(reply)) {
      throw new FileSystemException("vfs.provider.ftp/connect-rejected.error");
    }
    client.enterLocalPassiveMode();
    boolean login = client.login(user, pass);

    URL url = new URL("ftp://" + user + ":" + pass + "@" + server + remotePath + ";type=i");
    URLConnection urlc = url.openConnection();
    urlc.setConnectTimeout(1000);
    InputStream is = urlc.getInputStream();
    BufferedWriter bw = new BufferedWriter(new FileWriter(localPath));

    int c;
    client.setSoTimeout(tenseconds);

    client.setControlKeepAliveTimeout(10000);

    while ((c = is.read()) != -1) {
      urlc.getConnectTimeout();

      bw.write(c);

    }

    long t2 = System.currentTimeMillis();

    System.out.println(t2);

    JOptionPane.showMessageDialog(null, "se cargo el primer fichero!", "información", JOptionPane.INFORMATION_MESSAGE);

    if (login) {

      FTPFile[] files = client.listFiles();
      for (FTPFile file : files) {

        if (file.getType() == FTPFile.DIRECTORY_TYPE) {

          System.out.println("ftp file: " + file.getName() + ";" + FileUtils.byteCountToDisplaySize(file.getSize()));

        } else if (file.getType() == FTPFile.FILE_TYPE) {
          System.out.println("ftp file: " + file.getName() + ";" + FileUtils.byteCountToDisplaySize(file.getSize()));

        }

      }

      is.close();
      bw.close();

      client.setSoTimeout(tenseconds);
      client.logout();
      client.disconnect();

    }

  } catch (IOException e) {
    StringWriter sw0 = new StringWriter();
    PrintWriter p0 = new PrintWriter(sw0, true);
    e.printStackTrace(p0);

    System.out.println("connection probably lost");
    JOptionPane.showMessageDialog(null, "Error: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
  }
}

setdefaulttimeout はすべてのタイムアウトをアクティブにするために使用され、connectiontiomeout は接続を待機するために使用され、getsotimeouts はファイルをダウンロードするときに使用されますが、機能しません5 秒なのでファイルはダウンロードされませんが、機能しません。接続タイムアウトに関するいくつかの問題があり、socketfactory を使用する必要があることを読みました。そのため、ソケット ファクトリも作成し、試してみましたが、機能しませんでした。仕事をしていて、私は少し必死になっているところに達したので、助けを求めています。私は皆client.setControlKeepAliveTimeout(10000);、アライブタイムアウトを確立しようとしましたが、うまくいきませんでした! :(

4

0 に答える 0