在FileZilla 中:
- 用sftp协议连接Server ,需要用port 22
- 用ftp协议连接Server, 用port21

一个控制端口一个数据传输端口。
端口20才是真正传输所用到的端口,端口21只用于FTP的登陆认证。

sftp工具

package com.demo.utils;import com.jcraft.jsch.*;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import java.io.*;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
import java.util.stream.Collectors;/*** sftp 工具类** @version v1.0* @date 2019/8/13 11:34*/
@Component
@Slf4j
public class SftpUtils {private ChannelSftp sftp;private boolean isReady = false;private FtpConfig config;private Session sshSession;@Dataprivate class FtpConfig {private String server;private String port;private String username;private String password;private String encoding;}/*** 连接sftp服务器*/public SftpUtils(String server, String port, String username, String password, String encoding) {config = new FtpConfig();config.setServer(server);config.setPort(port);config.setUsername(username);config.setPassword(password);config.setEncoding(encoding);log.info("server = {}, port = {}, username = {}, password = {}", server, port, username, password);}public SftpUtils() {}private void setReady() throws Exception {try {if (!isReady) {JSch jsch = new JSch();sshSession = jsch.getSession(config.getUsername(), config.getServer(), Integer.parseInt(config.getPort()));log.info("Session created.");sshSession.setPassword(config.getPassword());Properties sshConfig = new Properties();sshConfig.put("StrictHostKeyChecking", "no");sshSession.setConfig(sshConfig);isReady = true;log.info("Session is ready.");}if (sshSession != null && !sshSession.isConnected()) {sshSession.connect();Channel channel = sshSession.openChannel("sftp");channel.connect();sftp = (ChannelSftp) channel;Class<ChannelSftp> c = ChannelSftp.class;Field f = c.getDeclaredField("server_version");f.setAccessible(true);f.set(sftp, 2);sftp.setFilenameEncoding(config.getEncoding());log.info("Session is connected.");}} catch (Exception e) {this.close();log.error("sftp连接服务器出错,host:" + config.getServer(), e);throw e;}}/*** 下载文件** @param directory    文件所在目录* @param downloadFile 下载的文件url* @param saveFile     存在本地的路径* @throws Exception*/public boolean downloadFile(String directory, String downloadFile, String saveFile) throws Exception {log.info("directory:{},downloadFile:{},saveFile:{}", directory, downloadFile, saveFile);try {setReady();sftp.cd(directory);File localFile = new File(saveFile);if (!localFile.exists()) {if (localFile.getParentFile() != null && !localFile.getParentFile().exists()) {localFile.getParentFile().mkdirs();}localFile.createNewFile();}sftp.get(downloadFile, new FileOutputStream(localFile));return true;} catch (Exception e) {log.error("sftp下载文件出错,directory:" + directory, e);throw e;}}/*** 上传文件* @param filePath* @param fileName* @param file* @return* @throws Exception*/public boolean uploadFile(String filePath, String fileName, File file) throws Exception {log.info("directory:{},downloadFile:{},saveFile:{}", filePath, fileName, file);try {setReady();sftp.cd(filePath);sftp.put(new FileInputStream(file), fileName);return true;} catch (Exception e) {log.error("sftp上传文件出错,fileName:" + fileName, e);throw e;}}// 获取文件行数public long getLineCountRemoveEmpty(String directory,String fileName) throws Exception {String tmp;try{long lines = 0;BufferedReader reader = getBufferedReader(directory, fileName);while ((tmp=reader.readLine())!=null){if(tmp.equals(""));else {lines++;}}return lines;} catch (IOException e) {e.printStackTrace();} catch (SftpException e) {log.error("sftp获取文件行数,directory:{},fileName:{},errorInfo",directory,fileName, e);throw e;}return 0;}// 获取文件行数public BufferedReader getBufferedReader(String directory,String fileName) throws Exception{setReady();sftp.cd(directory);InputStream inputStream = sftp.get(fileName);InputStreamReader isr = new InputStreamReader(inputStream);BufferedReader br = new BufferedReader(isr);return br;}/*** 列出目录下的文件** @param directory 文件所在目录* @throws Exception*/public List<String> listFiles(String directory) throws Exception {log.info("directory:{}", directory);setReady();Vector<ChannelSftp.LsEntry> vector = sftp.ls(directory);if (vector.isEmpty()) {return Collections.emptyList();}return vector.stream().map(ChannelSftp.LsEntry::getFilename).collect(Collectors.toList());}public void close() throws IOException {if (sftp != null && sftp.isConnected()) {sftp.disconnect();}if (sshSession != null && sshSession.isConnected()) {sshSession.disconnect();}isReady = false;log.info("JSCH session close");}public static void main(String[] args) throws Exception {SftpUtils sftpUtils = new SftpUtils("47.112.219.114", "32122", "root", "qiaoyuan@2019", "UTF-8");List<String> files = sftpUtils.listFiles("/usr/local/test");for (String file:files){System.out.println(file);}System.out.println(sftpUtils.getBufferedReader("/usr/local/test", "test").readLine());sftpUtils.close();}
}

ftp工具

hutool-all-5.0.7.jar包中的

cn.hutool.extra.ftp.Ftp

21和22端口 在java中的使用相关推荐

  1. java中log4j的详解(转)

    阅读: 76 评论: 0 作者: over 发表于 2009-11-25 13:21 原文链接 详细讲解Java中log4j的使用方法 1.Log4j是什么? Log4j可以帮助调试(有时候debug ...

  2. Java中“最终类”的意义是什么?

    我正在读一本关于Java的书,它说您可以将整个类声明为final . 我想不出我会在哪里使用它. 我只是编程的新手,我想知道程序员是否真的在他们的程序上使用了它 . 如果他们这样做了,他们什么时候使用 ...

  3. Java 中代码优化的 30 个小技巧(中)

    11 位运算效率更高 如果你读过 JDK 的源码,比如 ThreadLocal.HashMap 等类,你就会发现,它们的底层都用了位运算. 为什么开发 JDK 的大神们,都喜欢用位运算? 答:因为位运 ...

  4. 端口渗透·网站渗透过程 --21 ,22,873,3306,6379,8080(8080端口是针对CMS的渗透)...

    声明:文章渗透网站为模拟环境,文章只为利用过程 文章为信息收集和端口渗透两部分,21端口为ftp版本漏洞 8080端口为CMS的渗透 信息收集: ·使用扫描工具nmap ,PortScan 对整个网段 ...

  5. 修改ftp服务器开放22端口,linux服务器修改ftp默认21端口方法

    1.登录服务器,打开vsftp.conf文件 # vim /etc/vsftpd/vsftpd.conf 2.在文件末尾增加listen_port=8021 #remote_charset=CP125 ...

  6. 21、22、23、53、80、123、161、1433、3306、3389 端口的用途或协议

    21.22.23.53.80.123.161.1433.3306.3389 端口的用途或协议 一.如下 一.如下 21 端口:FTP(File Transfer Protocol)数据传输端口,用于在 ...

  7. 24张图带你彻底理解Java中的21种锁

    本篇主要内容如下: 本篇主要内容 本篇文章已收纳到我的Java在线文档. Github 我的SpringCloud实战项目持续更新中 帮你总结好的锁: 序号 锁名称 应用 1 乐观锁 CAS 2 悲观 ...

  8. 【Java面试题】21 Java中的异常处理机制的简单原理和应用。

    [Java面试题]21 Java中的异常处理机制的简单原理和应用. 参考文章: (1)[Java面试题]21 Java中的异常处理机制的简单原理和应用. (2)https://www.cnblogs. ...

  9. java中怎么判断一段代码时线程安全还是非线程安全_24张图带你彻底理解Java中的21种锁...

    (给ImportNew加星标,提高Java技能) 转自:悟空聊架 本篇主要内容如下: 本篇文章已收纳到我的 Java 在线文档. Github.我的 SpringCloud 实战项目持续更新中. 帮你 ...

最新文章

  1. 你真的看懂招聘要求了?
  2. java线程 kill linux_linux查看进程和线程的命令
  3. springboot 应用中静态资源下载
  4. JDK6笔记(3)----正则表达式
  5. String有两种赋值方式
  6. windows系统c 实现ftp服务器,windows系统c 实现ftp服务器
  7. 攻防世界web新手区解题 /cookie / disabled_button / weak_auth
  8. 在C#中将集合用作键
  9. Fragment学习1--生命周期
  10. python class def try_python 中exception,class学习
  11. 两条平行导线同向电流_如何根据功率计算电流?老师傅说这么做很简单
  12. linux安装软件imagemagick,Linux系统中怎么安装和使用ImageMagick软件?
  13. coreldraw x4忽略视图样式补丁_80%的人都忽略了PPT画布之外的用法,但这6点真的很实用...
  14. 免费网站搭建与phpstorm远程部署
  15. ubuntu 14.04.1 smbd环境搭建
  16. XSS注入之xss-labs
  17. google退出后产生的影响
  18. Python每日一练-----难题唯唯诺诺,易题重拳出击?(回文数)
  19. Pythom爬虫之图虫小姐姐图片的爬取:
  20. 面向订单生产型电子制造企业,如何快速响应客户?

热门文章

  1. 创业第一步:创业方程式
  2. RJS 模板的另种用法
  3. 新版标准日本语高级_第18课
  4. 页面结构图示例图_定义示例站点的页面结构
  5. Flask学习笔记(一)
  6. JSP中连接SQL 2000数据库的问题总结
  7. java redis使用卡死_注意!Redis使用不当可能导致应用卡死
  8. 拉里 埃里森_拉里·埃里森(Larry Ellison)的宝座
  9. 立创eda学习笔记十四:pcb板画布设置
  10. 如何成为全栈工程师?