4

現在、私はSFTPプロトコルに取り組んでいます.Jschライブラリを使用してSFTPクライアントを作成し、Apache Mina Sshdライブラリを使用してSFTPサーバーを作成しました.それらの間の接続を確立し、SFTPサーバーにファイルを正常に送信できます.現在、SFTPサーバーの作成に取り組んでいます着信ファイルを処理するサイドファイルハンドラー。例として、SFTPサーバーがSFTPクライアントからファイルを受信できるとしましょうが、現在私の実装では、ファイルがサーバーに到着したときに通知する方法はありません.サーバーのルートフォルダーに移動して、そこにあるかどうかを確認するだけです.ファイルが利用可能です。それが、ファイルが到着したかどうかを知る方法です。

ファイルがサーバーに到着すると、ファイルが到着し、ファイルの内容(ファイル名とその他の詳細)をユーザーに通知するように実装したいと思います。しかし、問題は、私がApache Mina sshd APIを初めて使用することです。しかし、私はそれを理解できませんでした。

Apache Mina Sshd サーバーで着信ファイルを処理するために既に実装されているリスナーがある場合、またはそうでない場合は、着信ファイル用に独自のリスナーを実装する方法を教えてください。

SFTP サーバーコード

public class SftpServerStarter {

    private SshServer sshd;
    private final static Logger logger = LoggerFactory.getLogger(SftpServerStarter.class);

    public void start(){


        sshd = SshServer.setUpDefaultServer();
        sshd.setPort(22);
        sshd.setHost("localhost");

        sshd.setPasswordAuthenticator(new MyPasswordAuthenticator());
        sshd.setPublickeyAuthenticator(new MyPublickeyAuthenticator());
        sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider());
        sshd.setSubsystemFactories(Arrays.<NamedFactory<Command>>asList(new SftpSubsystem.Factory()));
        sshd.setCommandFactory(new ScpCommandFactory());
        sshd.setFileSystemFactory(new VirtualFileSystemFactory("C:/root"));


        try {
            logger.info("Starting ...");
            sshd.start();
            logger.info("Started");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            logger.info("Can not Start Server");
        }
    }

}
4

3 に答える 3

2

最終的に解決策を見つけましたが、Apache Mina SSHD API からのものではありません。概念は次のとおりです。サーバーのルート ディレクトリでファイルの変更を監視できます。サーバー フォルダで変更されたファイルがある場合、イベントがトリガーされます。これを行うために利用できる API はたくさんあります。私のコード スニペットでは、org.apache.commons.io.monitor.

SFTPFileListner クラス

public static void startMonitor(String rootFolder) throws Exception {

        //every 5 seconds it will start monitoring
        final long pollingInterval = 5 * 1000;

        File folder = new File(rootFolder);

        if (!folder.exists()) {

            throw new RuntimeException("ERROR : Server root directory not found: " + rootFolder);
        }

        FileAlterationObserver observer = new FileAlterationObserver(folder);
        FileAlterationMonitor monitor = new FileAlterationMonitor(pollingInterval);
        FileAlterationListener listener = new FileAlterationListenerAdaptor() {

            @Override
            public void onFileCreate(File file) {
                try {

                    System.out.println("[SFTPFileListner] Received :"+ file.getName());
                    System.out.println("[SFTPFileListner] Received File Path :"+ file.getCanonicalPath());



                } catch (IOException e) {
                    throw new RuntimeException("ERROR: Unrecoverable error when creating files " + e.getMessage(),e);
                }
            }

        };

        observer.addListener(listener);
        monitor.addObserver(observer);
        monitor.start();
    }

モニター クラスを作成したら、SFTP サーバー クラスで実装されたメソッドを呼び出すことができます。

SFTP サーバー クラス

//pass server root directory 
SFTPFileListner.startMonitor("C:/root");
于 2015-07-15T04:49:20.477 に答える
-1

別の投稿で述べたように、Mina は着信ファイルの受信または部分的な受信時にトリガーを処理する機能を直接提供してくれませんでしたが、私たちのニーズは非常に具体的でした。したがって、私たちの唯一の選択肢は、上記のソリューションが行っている Mina の外に出ることでした。Mina のプル リクエスト/機能としてプッシュするか、オープン ソースの補完ソリューションとしてさらに開発する価値があるかもしれません。何かがサーバーに届いたときにアクティブな通知/トリガーシステムを使用するために人々が直面する一般的な問題だと思います。残りの開発も頑張ってください!

于 2015-07-15T10:54:11.260 に答える