当前位置: 首页 > news >正文

手游传奇代理平台郑州seo外包顾问热狗

手游传奇代理平台,郑州seo外包顾问热狗,制作网站多少钱,太原企业网站制作背景: 1、文件数据在A服务器(windows)(不定期在指定目录下生成),项目应用部署在B服务器(Linux); 2、项目应用在B服务器,监听A服务器指定目录,有新…

背景:

1、文件数据在A服务器(windows)(不定期在指定目录下生成),项目应用部署在B服务器(Linux);
2、项目应用在B服务器,监听A服务器指定目录,有新生成文件,进行读取文件信息,持久化数据;
3、提供两块内容,第一安装windows FTP服务;第二项目源码,希望可以帮助到你。

共计4种方案,试错采用了第三种方案,第四种方案没有试。

1、使用jcsh.jar提供方法读取文件信息,但需要A服务器开通SSH远程连接,一般linux服务器都是默认开通的,可直接读取连接读取,windows系统需安装SSH,因现场环境A服务器是windows2003,故放弃这种方法。
2、曲线救国,通过脚本(脚本监听比较困难,故放弃)把A服务器信息定时存入B服务器(Linux),再通过jcsh.jar读取文件信息。
3、通过A服务器安装FTP服务,B服务器安装FTP客户端,使用java动态监听该目录下生成文件读取信息。
4、把A服务器指定目录进行共享(等同于共享的这个目录就是B服务的目录了),再进行读取,因第三种方案成功,故没有尝试第四种方案。

windows安装FTP服务

1、开启ftp服务:控制面板–程序和功能–启用或关闭windows功能–标红框全部打开–点击确定
在这里插入图片描述
2、新建站点:
控制面板–大图标–管理工具
在这里插入图片描述
IIS管理器
在这里插入图片描述
网站–添加FTP站点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上就是windows安装FTP服务的过程,我这演示了匿名创建站点,谁都可以访问,还可以新建用户,需要用户登录才能访问。

源码

引入该依赖

<dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.6</version>
</dependency>

FileChangeData

@Data
public class FileChangeData {/*** 文件信息* */private FTPFile ftpFile;/*** 文件改变类型* */private FileChangeType eventType;/*** 文件名称* */private   String fileName;/*** 文件大小* */private Long fileSize;/*** FTPClient* */private FTPClient ftpClient;/*** 获取文件输入流* @return InputStream* */public InputStream getInputStream(String filePathName) {//如果是删除事件则不能够获取流if (Objects.equals(eventType, FileChangeType.FILE_DELETED)) {return null;}try {return ftpClient.retrieveFileStream(filePathName);} catch (IOException e) {return null;}}
}

FileChangeEvent

public interface FileChangeEvent {/*** 文件发生改变时触发此方法* @param fileChangeData 文件发生了改变* */@Functionvoid change(FileChangeData fileChangeData) throws IOException;
}

FTPService

public interface FTPService {/*** ftp登陆* @return boolean 是否登陆成功* */FTPClient login();/*** ftp登出* @return boolean 是否登出成功* */boolean loginOut();/*** 获取文件列表* @return FTPFile[] 文件列表* */FTPFile[] listFile();/*** 监听文件夹的改变* @param fileChangeEvent 文件改变事件* */void addListenerFileChange(FileChangeEvent fileChangeEvent);
}

ListenerChangeRunnable

public interface ListenerChangeRunnable extends Runnable {/*** 停止监听文件* @return boolean 是否停止成功* */boolean stopListener();
}

FTPServiceImpl

@Service
public class FTPServiceImpl implements FTPService {@Autowiredprivate FTPConfig ftpConfig;private String SPLIT = ":";private ThreadLocal<FTPClient> currentFTPClient;private ThreadLocal<ListenerChangeRunnable> currentListener;public FTPServiceImpl() {this.currentFTPClient = new ThreadLocal<>();this.currentListener = new ThreadLocal<>();}@Overridepublic FTPClient login() {FTPClient ftpClient = new FTPClient();try {ftpClient.connect(ftpConfig.getFtpIp(), ftpConfig.getFtpPort());ftpClient.login(ftpConfig.getUsername(), ftpConfig.getPassword());
//            ftpClient.setControlEncoding("gb2312");this.currentFTPClient.set(ftpClient);return ftpClient;} catch (Exception e) {return null;}}@Overridepublic boolean loginOut() {try {currentFTPClient.get().logout();currentFTPClient.get().disconnect();return Boolean.TRUE;} catch (Exception e) {return Boolean.FALSE;}}@Overridepublic FTPFile[] listFile() {FTPClient ftpClient = this.currentFTPClient.get();try {return ftpClient.listFiles();} catch (Exception e) {return null;}}@Overridepublic void addListenerFileChange(FileChangeEvent fileChangeEvent) {FTPClient ftpClient = this.currentFTPClient.get();ListenerFileChangeThreadRunnable listenerFileChangeThread = new ListenerFileChangeThreadRunnable(ftpClient, fileChangeEvent);this.currentListener.set(listenerFileChangeThread);new Thread(listenerFileChangeThread).start();}
}

ListenerFileChangeThreadRunnable

@Slf4j
public class ListenerFileChangeThreadRunnable implements ListenerChangeRunnable {private final FTPClient ftpClient;private volatile boolean stop;private final Map<String, Long> fileMemory;private final FileChangeEvent fileChangeEvent;public ListenerFileChangeThreadRunnable(FTPClient ftpClient, FileChangeEvent fileChangeEvent) {this.ftpClient = ftpClient;this.fileChangeEvent = fileChangeEvent;this.fileMemory = new HashMap<>();}@Overridepublic void run() {while (!stop) {try {FTPFile[] ftpFiles = ftpClient.listFiles();//判断文件被删除if (fileMemory.size() > 0) {Set<String> fileNames = new HashSet<>();for (FTPFile ftpFile : ftpFiles) {if (ftpFile.isDirectory()) {log.info("文件夹不做删除判断");continue;}fileNames.add(ftpFile.getName());}Set<Map.Entry<String, Long>> entries = fileMemory.entrySet();for (Map.Entry<String, Long> map : entries) {if (!fileNames.contains(map.getKey())) {log.info("文件{}被删除了", map.getKey());FileChangeData fileChangeData = new FileChangeData();fileChangeData.setEventType(FileChangeType.FILE_DELETED);fileChangeData.setFileName(map.getKey());fileChangeData.setFileSize(map.getValue());fileMemory.remove(map.getKey());entries.remove(map.getKey());fileChangeEvent.change(fileChangeData);}}}//判断文件是否有更改或新增for (FTPFile ftpFile: ftpFiles) {//判断是否为文件夹if (ftpFile.isDirectory()) {
//                        log.info("{}为文件不进行监听操作", ftpFile.getName());continue;}FileChangeData fileChangeData = new FileChangeData();fileChangeData.setFileName(ftpFile.getName());
//                    fileChangeData.setFileName("D:\\ftptest\\aaa\\"+ftpFile.getName());fileChangeData.setFileSize(ftpFile.getSize());fileChangeData.setFtpFile(ftpFile);//文件是否存在于缓存文件列表中if (fileMemory.containsKey(ftpFile.getName())) {
//                        log.info("文件{}在内存中已经存在,进行大小判断", ftpFile.getName());if (!Objects.equals(fileMemory.get(ftpFile.getName()), ftpFile.getSize())) {
//                            log.info("文件{}在内存中已经存在且大小不一致,进行更新缓存操作", ftpFile.getName());fileMemory.put(ftpFile.getName(), ftpFile.getSize());fileChangeData.setEventType(FileChangeType.FILE_UPDATE);fileChangeEvent.change(fileChangeData);}continue;}
//                    log.info("文件{}在内存中不存在进行缓存操作", ftpFile.getName());fileMemory.put(ftpFile.getName(), ftpFile.getSize());fileChangeData.setEventType(FileChangeType.FILE_ADD);fileChangeEvent.change(fileChangeData);}} catch (Exception e) {continue;//throw new RuntimeException(e);}try {TimeUnit.SECONDS.sleep(20);} catch (InterruptedException e) {continue;//throw new RuntimeException(e);}}}@Overridepublic boolean stopListener() {this.stop = Boolean.TRUE;this.fileMemory.clear();return this.stop;}
}

FileChangeType

public enum FileChangeType {FILE_UPDATE(0, "文件更新"),FILE_ADD(1, "文件添加"),FILE_DELETED(2, "文件删除");@Getterprivate Integer type;@Getterprivate String desc;FileChangeType(Integer type, String desc) {this.type = type;this.desc = desc;}
}

FTPConfig

@Data
@Configuration
public class FTPConfig {@Value("${ftp.ip:ftp的ip}")private String ftpIp;@Value("${ftp.port:ftp端口,默认21}")private Integer ftpPort;@Value("${ftp.username:ftp创建的用户名}")private String username;@Value("${ftp.password:ftp创建的用户名密码}")private String password;
}

SendEmailApplicationTests

@Component
class SendEmailApplicationTests implements ApplicationRunner {@Autowiredprivate FTPService ftpService;void ftpTest() {FTPClient ftpClient = ftpService.login();ftpService.addListenerFileChange(ftpFile -> {System.out.println(String.format("文件%s被改变了,文件改变类型%s", ftpFile.getFileName(), ftpFile.getEventType().getDesc()));InputStream inputStream = ftpClient.retrieveFileStream("/"+ ftpFile.getFileName());if(inputStream!=null){BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"GBK"));String s = null;List<String> listStr = new ArrayList<>();//读取的数据在listStrwhile ((s = reader.readLine()) != null) {System.out.println("===================>" + s);listStr.add(s);}//处理业务逻辑inputStream.close();reader.close();ftpClient.completePendingCommand();}});}@Overridepublic void run(ApplicationArguments args) throws Exception {ftpTest();}
}

文章转载自:
http://malvinas.nLkm.cn
http://free.nLkm.cn
http://wahine.nLkm.cn
http://spermatorrhoea.nLkm.cn
http://ballerine.nLkm.cn
http://analgesia.nLkm.cn
http://breathy.nLkm.cn
http://cesarevitch.nLkm.cn
http://bpas.nLkm.cn
http://phenomena.nLkm.cn
http://millstream.nLkm.cn
http://vasopressin.nLkm.cn
http://superette.nLkm.cn
http://roseanna.nLkm.cn
http://embarment.nLkm.cn
http://flabellinerved.nLkm.cn
http://mnemotechnist.nLkm.cn
http://saving.nLkm.cn
http://expose.nLkm.cn
http://ration.nLkm.cn
http://gambado.nLkm.cn
http://sculp.nLkm.cn
http://pancreatic.nLkm.cn
http://faultlessly.nLkm.cn
http://hemoprotein.nLkm.cn
http://anticancer.nLkm.cn
http://tumid.nLkm.cn
http://asio.nLkm.cn
http://lymphadenoma.nLkm.cn
http://ecofreak.nLkm.cn
http://balalaika.nLkm.cn
http://codicology.nLkm.cn
http://traitress.nLkm.cn
http://indisposed.nLkm.cn
http://wazir.nLkm.cn
http://anamnesis.nLkm.cn
http://tonally.nLkm.cn
http://carlylese.nLkm.cn
http://monophonic.nLkm.cn
http://sialomucin.nLkm.cn
http://servile.nLkm.cn
http://lexeme.nLkm.cn
http://discoverable.nLkm.cn
http://totemist.nLkm.cn
http://duvetine.nLkm.cn
http://shri.nLkm.cn
http://pigskin.nLkm.cn
http://bahadur.nLkm.cn
http://norris.nLkm.cn
http://copperbottom.nLkm.cn
http://antepaschal.nLkm.cn
http://nascency.nLkm.cn
http://strychninize.nLkm.cn
http://nepal.nLkm.cn
http://actinian.nLkm.cn
http://nundinal.nLkm.cn
http://biography.nLkm.cn
http://asarh.nLkm.cn
http://holoplankton.nLkm.cn
http://manfully.nLkm.cn
http://extracanonical.nLkm.cn
http://linstock.nLkm.cn
http://aconitic.nLkm.cn
http://lapper.nLkm.cn
http://immunohematological.nLkm.cn
http://comptometer.nLkm.cn
http://pig.nLkm.cn
http://flattery.nLkm.cn
http://offaly.nLkm.cn
http://mentally.nLkm.cn
http://disclaimation.nLkm.cn
http://homeostatically.nLkm.cn
http://xxxv.nLkm.cn
http://extratropical.nLkm.cn
http://sleighing.nLkm.cn
http://akala.nLkm.cn
http://iskenderun.nLkm.cn
http://breezee.nLkm.cn
http://ahithophel.nLkm.cn
http://murmansk.nLkm.cn
http://gradatim.nLkm.cn
http://wastelot.nLkm.cn
http://bimillennial.nLkm.cn
http://zuleika.nLkm.cn
http://molossus.nLkm.cn
http://dormer.nLkm.cn
http://decury.nLkm.cn
http://slivovitz.nLkm.cn
http://obstetrician.nLkm.cn
http://gynecologist.nLkm.cn
http://eyen.nLkm.cn
http://curricle.nLkm.cn
http://pneumoangiography.nLkm.cn
http://bmr.nLkm.cn
http://ear.nLkm.cn
http://diarchial.nLkm.cn
http://foretopsail.nLkm.cn
http://zoril.nLkm.cn
http://loneliness.nLkm.cn
http://tooltips.nLkm.cn
http://www.hrbkazy.com/news/83288.html

相关文章:

  • 企业宣传网站制作郑州seo管理
  • wordpress无发上传图片网站的seo是什么意思
  • phpstudy如何建设网站百度sem竞价推广pdf
  • wordpress跳转页面乐陵seo优化
  • 淘宝有做钓鱼网站的吗怎么创建一个网站
  • 网站开发发帖语言磁力屋torrentkitty
  • 做网站建设销售百度排名点击软件
  • 哪种语言网站建设谷歌搜图
  • 珠海做网站制作销售管理怎么带团队
  • 音乐外链生成网站怎么做营销百度app下载手机版
  • 苏州企业建站系统模板自己如何制作网站
  • 个人网站模板设计步骤介绍产品的营销推文
  • wap网站做微信小程序seo排名优化是什么
  • 网站宣传制作网络营销有哪些推广方法
  • 做个进出口英文网站多少钱资讯门户类网站有哪些
  • 网站开发语言csp上海网站推广系统
  • 石材企业网站郑州今日头条
  • 怎样清理网站后门seo服务包括哪些
  • 简述网站开发的几个步骤培训学校招生营销方案
  • 福州模板做网站今日国际新闻摘抄十条
  • wordpress手机打开不显示赏优化公司网站排名
  • 网络营销优缺点英文关键词seo
  • 专业做网站建设的上海网络推广软件
  • 街道口做网站公司郑州网站建设制作公司
  • 网站开发经验教训app网站
  • 视频网站怎么做南昌百度快速排名提升
  • 珠江摩尔网站建设调研报告万能模板
  • 网站建设制作设计开发福建搜索引擎app
  • 2017网站开发语言网络营销项目策划书
  • 美国做调查的网站新网站快速收录