我想知道,如果有任何已经实现的侦听器处理传入文件在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");
}
}
}
我开始使用@Gihan的建议,但在用户完成在某些客户端上传文件之前,文件监视器处理文件时遇到了一些问题。
以下是我从Mina的源代码中找到的解决方案。尽管Apache Mina的站点上的文档很稀疏,无用,但我认为这正是开发人员使用库的方式。
注意:由于您的需求可能与我的不同,请记住,这可能不是一个复制粘贴解决方案。您可能需要修改此代码以满足您的需求,但我相当相信,此代码确实提供了您所寻找的解决方案的关键。
创建实现org.apache.sshd.server.subsystem.sftp.sftpEventListener
的自己的类。下面是我的一个例子。我的实现设置为在新上载或覆盖文件时运行一系列注册的FileUploadCompleteListener
方法,并阻止用户导航或创建目录的尝试。
public class SFTPServiceSFTPEventListener implements SftpEventListener {
Logger logger = Logger.getLogger(SFTPServiceSFTPEventListener.class);
SFTPService service;
public SFTPServiceSFTPEventListener(SFTPService service) {
this.service = service;
}
public interface FileUploadCompleteListener {
void onFileReady(File file);
}
private List<FileUploadCompleteListener> fileReadyListeners = new ArrayList<FileUploadCompleteListener>();
public void addFileUploadCompleteListener(FileUploadCompleteListener listener) {
fileReadyListeners.add(listener);
}
public void removeFileUploadCompleteListener(FileUploadCompleteListener listener) {
fileReadyListeners.remove(listener);
}
@Override
public void initialized(ServerSession serverSession, int version) {
}
@Override
public void destroying(ServerSession serverSession) {
}
@Override
public void open(ServerSession serverSession, String remoteHandle, Handle localHandle) {
File openedFile = localHandle.getFile().toFile();
if (openedFile.exists() && openedFile.isFile()) {
}
}
@Override
public void read(ServerSession serverSession, String remoteHandle, DirectoryHandle localHandle, Map<String,Path> entries) {
}
@Override
public void read(ServerSession serverSession, String remoteHandle, FileHandle localHandle, long offset, byte[] data, int dataOffset, int dataLen, int readLen) {
}
@Override
public void write(ServerSession serverSession, String remoteHandle, FileHandle localHandle, long offset, byte[] data, int dataOffset, int dataLen) {
}
@Override
public void blocking(ServerSession serverSession, String remoteHandle, FileHandle localHandle, long offset, long length, int mask) {
}
@Override
public void blocked(ServerSession serverSession, String remoteHandle, FileHandle localHandle, long offset, long length, int mask, Throwable thrown) {
}
@Override
public void unblocking(ServerSession serverSession, String remoteHandle, FileHandle localHandle, long offset, long length) {
}
@Override
public void unblocked(ServerSession serverSession, String remoteHandle, FileHandle localHandle, long offset, long length, Boolean result, Throwable thrown) {
}
@Override
public void close(ServerSession serverSession, String remoteHandle, Handle localHandle) {
File closedFile = localHandle.getFile().toFile();
if (closedFile.exists() && closedFile.isFile()) {
logger.info(String.format("User %s closed file: \"%s\"", serverSession.getUsername(), localHandle.getFile().toAbsolutePath()));
this.service.UserWroteFile(serverSession.getUsername(), localHandle.getFile());
for (FileUploadCompleteListener fileReadyListener : fileReadyListeners) {
fileReadyListener.onFileReady(closedFile);
}
}
}
@Override
public void creating(ServerSession serverSession, Path path, Map<String,?> attrs) throws UnsupportedOperationException {
logger.warn(String.format("Blocked user %s attempt to create a directory \"%s\"", serverSession.getUsername(), path.toString()));
throw new UnsupportedOperationException("Creating sub-directories is not permitted.");
}
@Override
public void created(ServerSession serverSession, Path path, Map<String,?> attrs, Throwable thrown) {
String username = serverSession.getUsername();
logger.info(String.format("User %s created: \"%s\"", username, path.toString()));
service.UserWroteFile(username, path);
}
@Override
public void moving(ServerSession serverSession, Path path, Path path1, Collection<CopyOption> collection) {
}
@Override
public void moved(ServerSession serverSession, Path source, Path destination, Collection<CopyOption> collection, Throwable throwable) {
String username = serverSession.getUsername();
logger.info(String.format("User %s moved: \"%s\" to \"%s\"", username, source.toString(), destination.toString()));
service.UserWroteFile(username, destination);
}
@Override
public void removing(ServerSession serverSession, Path path) {
}
@Override
public void removed(ServerSession serverSession, Path path, Throwable thrown) {
}
@Override
public void linking(ServerSession serverSession, Path source, Path target, boolean symLink) throws UnsupportedOperationException {
logger.warn(String.format("Blocked user %s attempt to create a link to \"%s\" at \"%s\"", serverSession.getUsername(), target.toString(), source.toString()));
throw new UnsupportedOperationException("Creating links is not permitted");
}
@Override
public void linked(ServerSession serverSession, Path source, Path target, boolean symLink, Throwable thrown) {
}
@Override
public void modifyingAttributes(ServerSession serverSession, Path path, Map<String,?> attrs) {
}
@Override
public void modifiedAttributes(ServerSession serverSession, Path path, Map<String,?> attrs, Throwable thrown) {
String username = serverSession.getUsername();
service.UserWroteFile(username, path);
}
}
步骤2:将侦听器的实例添加到服务器
实现了类之后,只需在服务器上调用start()
之前,实例化它并使用sftpsubsystemFactory
将其添加到服务器:
// Your SSHD Server
SshServer sshd = SshServer.setUpDefaultServer();
SftpSubsystemFactory sftpSubsystemFactory= new SftpSubsystemFactory();
// This is where to put your implementation of SftpEventListener
SFTPServiceSFTPEventListener sftpEventListener = new SFTPServiceSFTPEventListener(this);
sftpEventListener.addFileUploadCompleteListener(new SFTPServiceSFTPEventListener.FileUploadCompleteListener() {
@Override
public void onFileReady(File file) {
try {
doThingsWithFile(file);
} catch (Exception e) {
logger.warn(String.format("An error occurred while attempting to do things with the file: \"%s\"", file.getName()), e);
}
}
});
sftpSubsystemFactory.addSftpEventListener(sftpEventListener);
List<NamedFactory<Command>> namedFactoryList = new ArrayList<NamedFactory<Command>>();
namedFactoryList.add(sftpSubsystemFactory);
sshd.setSubsystemFactories(namedFactoryList);
// Do your other init stuff...
sshd.start();
在 Cadence 中部署代码期间,服务器重新启动功能如何工作?将重新启动哪些内容?它会仅重新启动 Cadence 服务,还是也会重新启动工作线程?如果重新启动工作人员,活动和工作流是否会从头开始重新启动?
我想使用斯坦福大学的NLP服务器与德语文本。我测试了http://corenlp.run/,它在德语中运行良好。如果我在自己的机器上用 java -mx4g -cp “*” edu.stanford.nlp.pipeline.StanfordCoreNLPServer [port] [超时] 它只适用于英语。如果我选择德语,我会收到错误消息 无法处理传入的注释 命令行显示: java.util.P
我是Java新手,希望接受包含股市详细信息的字符串。如果现有字符串包含脚本的购买订单,请按给定价格查找卖家。如果没有匹配项可用,则将新订单添加到现有采购订单队列。 这些需要尽可能快地完成,或者最好并行完成,以便给定的应用程序可以在最短的时间内处理尽可能多的订单。
问题内容: 我准备使用Java创建文件浏览器。目的是尽可能地模仿默认资源管理器的行为,无论底层操作系统是什么。 我没有用Java完成GUI编程。 我查找了Swing,SWT和JFace,并从本教程开始我的项目:http : //www.ibm.com/developerworks/opensource/library/os- ecgui1/ 我想知道您对解决此问题的最佳方法的看法。如果您可以评论编
最近遇到一个这样的需求:传一个压缩包给后台Linux服务器,后台保存后解压读取里面的文件,现学现做。在这里做个记录。 文件上传 文件上传有很多方法,这里推荐一个自己感觉挺好用的一种,代码奉上:
问题内容: 我创建了一个从有权访问的FTP服务器下载文件的功能。如何将文件上传回FTP服务器? 以下是我使用的download_files方法: 问题答案: 使用Apache Commons Net库中的FTPClient类。 这是一个带有示例的代码段: 摘录自http://www.kodejava.org/examples/356.html