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

西安大型网站制作昆明网络推广优化

西安大型网站制作,昆明网络推广优化,庄河做网站,免费咨询律师24小时背景 因项目需要,我们服务每天都需要通过SFTP协议来对接上下游进行文件传输,但是对于一些大文件,在与第三方公司的服务器对接过程中很可能会因为网络问题或上下游服务器性能问题导致文件上传或者下载被中断,每次重试都需要重新对…

背景

因项目需要,我们服务每天都需要通过SFTP协议来对接上下游进行文件传输,但是对于一些大文件,在与第三方公司的服务器对接过程中很可能会因为网络问题或上下游服务器性能问题导致文件上传或者下载被中断,每次重试都需要重新对文件进行上传和下载,非常浪费带宽、服务器资源和时间,因此我们需要尽量提升文件传输效率,减少不必要的文件传输损耗。

解决思路

我们平时用一些下载软件,都有个断点续传功能,可以基于上一次已经传输的偏移量进行传输,不需要重复传输已经传输完整的数据,大大节省文件下载或者文件上传时间。

在通过SFTP进行文件传输,同样可以利用该原理进行断点续传。

文件上传原理

上传文件时,你首先需要与SFTP服务器建立一个安全会话(Session)。这需要提供用户名、密码、SFTP服务器的地址及端口。一旦会话建立,就可以打开一个SFTP通道(Channel)进行文件传输。

在处理大文件时,为了防止因网络问题导致的文件传输中断,以及减少不必要的重复传输,我们通常会采用断点续传的方式。这意味着如果文件传输在中途中断,下一次传输可以从上次结束的地方开始,而不是重新开始。

JSch库的put方法支持断点续传。通过检查远程文件的大小,你可以确定已经上传的数据量。然后,使用FileInputStream来打开本地文件,并使用skip方法跳过已上传的部分。最后,使用put方法的RESUME标志从上次中断的地方开始上传剩余的文件部分。

这种方法的好处是:

  • 节省时间:不需要重新上传已经传输过的部分。
  • 减少资源消耗:减少网络带宽的使用,特别是在网络不稳定或计费昂贵的环境中。
  • 提高可靠性:即使在传输过程中发生中断,也可以保证最终文件的完整性。

文件下载原理

下载文件的原理与上传类似。同样需要建立会话和打开SFTP通道。使用get方法从SFTP服务器下载文件。如果你需要实现断点续传下载,你需要检查本地文件的大小,以此来确定已经下载的数据量。

如果本地文件的大小小于远程文件的大小,说明下载尚未完成,你可以从本地文件的末尾开始继续下载。JSch的get方法同样支持RESUME标志,允许你指定从远程文件的某个位置开始下载。

断点续传下载的好处包括:

  • 节省时间:如果下载被中断,可以继续从中断点开始,而不是从头开始。
  • 减少资源消耗:只下载尚未接收的文件部分,节约网络带宽。
  • 提高可靠性:保证即使在网络不稳定情况下,也可以最终获取完整文件。

代码实现

这里使用了com.github.mwiede的Jsch版本,是基于Jcraft 0.1.55增加了一些新算法的支持。

<dependency><groupId>com.github.mwiede</groupId><artifactId>jsch</artifactId><version>0.2.16</version>
</dependency>

文件上传断点续传实现:

加入SftpProgressMonitor可以更好监控文件传输的进度

package com.eshare.resumablesftp;import com.jcraft.jsch.*;import java.io.*;public class SFTPResumeUpload {private static final int PORT = 22;public static void main(String[] args) {String user = "parallels";String passwd = "xxx";String host = "192.168.50.33";String localFilePath = "/Users/evan/Downloads/1080p.mp4";String remoteFilePath = "/tmp/evan/test10.mp4";try {// 设置JSchJSch jsch = new JSch();Session session = jsch.getSession(user, host, PORT);session.setPassword(passwd);// 设置配置信息java.util.Properties config = new java.util.Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);// 连接到服务器session.connect();// 打开SFTP通道Channel channel = session.openChannel("sftp");channel.connect();ChannelSftp sftpChannel = (ChannelSftp) channel;long remoteSize = 0;// 检查远程文件是否存在SftpATTRS attrs = sftpChannel.lstat(remoteFilePath);if (!attrs.isReg()) {throw new FileNotFoundException("Remote file does not exist: " + remoteFilePath);}// 检查远程文件大小remoteSize = attrs.getSize();// 打开本地文件RandomAccessFile raf = new RandomAccessFile(localFilePath, "r");// 计算从哪里开始上传long startPos = Math.max(0, remoteSize);raf.seek(startPos);// 文件上传long totalBytes = raf.length();OutputStream os = sftpChannel.put(remoteFilePath, new MyProgressMonitor(totalBytes - remoteSize), ChannelSftp.RESUME);byte[] buffer = new byte[1024 * 1024];//1Mint bytesRead;while ((bytesRead = raf.read(buffer)) != -1) {os.write(buffer, 0, bytesRead);}os.close();raf.close();// 检查文件传输是否已经完成ÒÒif (sftpChannel.lstat(remoteFilePath).getSize() == totalBytes) {System.out.println("File upload completed successfully.");} else {System.out.println("File upload failed.");}// 关闭连接sftpChannel.exit();session.disconnect();} catch (JSchException | IOException | SftpException e) {e.printStackTrace();}}public static class MyProgressMonitor implements SftpProgressMonitor {private long totalBytes;private long transferredBytes = 0;public MyProgressMonitor(long totalBytes) {this.totalBytes = totalBytes;}@Overridepublic void init(int op, String src, String dest, long max) {System.out.println("Starting transfer: " + src + " --> " + dest);}@Overridepublic boolean count(long bytes) {transferredBytes += bytes;double percentage = (double) transferredBytes / totalBytes * 100;System.out.printf("Transferred %d of %d bytes (%.2f%%)\n", transferredBytes, totalBytes, percentage);return true;}@Overridepublic void end() {System.out.println("\nTransfer complete.");}}}

断点续传测试步骤

1.我本地放一个2.1G的测试文件

2.准备好远程目录,这里提前创建好一个测试目录在远程虚拟机/tmp/evan

3.启动程序,控制台会打印文件传输进度,文件传输到52%左右我把程序直接杀死来模拟网络中断或者传输中断的情况

4.重新启动程序,让程序自动从上一次传输的偏移量继续上传,大家可以尝试多次中断来模拟。

5.文件传输完成后,到远程目录对比文件大小,这里也可以通过文件checksum来进行对比,以下输出结果可以看到文件被成功上传。

文件下载断点续传实现

package com.eshare.resumablesftp;import com.jcraft.jsch.*;import java.io.*;
import java.math.BigInteger;
import java.nio.file.*;
import java.security.MessageDigest;public class SFTPResumeDownload {private static final int PORT = 22;public static void main(String[] args) {String user = "parallels";String passwd = "xxx";String host = "192.168.50.33";String localFilePath = "/Users/evan/Downloads/test10.mp4";String remoteFilePath = "/tmp/evan/test10.mp4";try {// 设置JSchJSch jsch = new JSch();Session session = jsch.getSession(user, host, PORT);session.setPassword(passwd);// 设置配置信息java.util.Properties config = new java.util.Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);// 连接到服务器session.connect();// 打开SFTP通道Channel channel = session.openChannel("sftp");channel.connect();ChannelSftp sftpChannel = (ChannelSftp) channel;// 检查远程文件是否存在SftpATTRS attrs = null;try {attrs = sftpChannel.lstat(remoteFilePath);} catch (SftpException e) {if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) {throw new FileNotFoundException("Remote file does not exist: " + remoteFilePath);}throw e;}// 检查本地文件大小long localSize = new File(localFilePath).length();// 打开远程文件long remoteSize = attrs.getSize();// 检查文件是否正常if (localSize >= remoteSize) {throw new FileSystemAlreadyExistsException("Local file exists and please check the size: " + remoteFilePath);}/// 计算从哪里开始下载long startPos = Math.max(0, localSize);// 文件下载FileOutputStream fos = new FileOutputStream(localFilePath, true);InputStream is = sftpChannel.get(remoteFilePath, new MyProgressMonitor(remoteSize - startPos), startPos);byte[] buffer = new byte[1024 * 1024];//1Mint bytesRead;while ((bytesRead = is.read(buffer)) != -1) {fos.write(buffer, 0, bytesRead);}is.close();fos.close();// 检查文件下载是否已经完成if (new File(localFilePath).length() == remoteSize) {System.out.println("File download completed successfully.");} else {System.out.println("File download failed.");}// 关闭连接sftpChannel.exit();session.disconnect();} catch (JSchException | IOException | SftpException e) {e.printStackTrace();}}public static class MyProgressMonitor implements SftpProgressMonitor {private long totalBytes;private long transferredBytes = 0;public MyProgressMonitor(long totalBytes) {this.totalBytes = totalBytes;}@Overridepublic void init(int op, String src, String dest, long max) {System.out.println("Starting transfer: " + src + " --> " + dest);}@Overridepublic boolean count(long bytes) {transferredBytes += bytes;double percentage = (double) transferredBytes / totalBytes * 100;System.out.printf("Downloaded %d of %d bytes (%.2f%%)\n", transferredBytes, totalBytes, percentage);return true;}@Overridepublic void end() {System.out.println("\nTransfer complete.");}}
}

断点续传测试步骤

1.我远程放一个2.1G的测试文件

parallels@ubuntu-linux-22-04-desktop:/tmp/evan$ ls -lh test10.mp4 
-rw-rw-r-- 1 parallels parallels 2.1G Jan 23 11:15 test10.mp4

2.准备好本地目录,这里是我本机下载目录/Users/evan/Downloads/
3.启动程序,控制台会打印文件传输进度,文件传输到86%左右我把程序直接杀死来模拟网络中断或者传输中断的情况

4.重新启动程序,让程序自动从上一次传输的偏移量继续上传,大家可以尝试多次中断来模拟。

5.文件传输完成后,到远程目录对比文件大小,这里也可以通过文件checksum来进行对比,以下输出结果可以看到文件被成功上传。

evan@EvandeMBP Downloads % ls -lh test10.mp4 
-rw-r--r--  1 evan  staff   2.1G Jan 23 14:39 test10.mp4
evan@EvandeMBP Downloads % 

文章转载自:
http://pekin.ptzf.cn
http://impersonate.ptzf.cn
http://swimathon.ptzf.cn
http://lispingly.ptzf.cn
http://oilskin.ptzf.cn
http://tuppence.ptzf.cn
http://crankshaft.ptzf.cn
http://lixiviation.ptzf.cn
http://norland.ptzf.cn
http://parorexia.ptzf.cn
http://fixable.ptzf.cn
http://punditry.ptzf.cn
http://troophorse.ptzf.cn
http://whitebait.ptzf.cn
http://reg.ptzf.cn
http://xyloid.ptzf.cn
http://manhood.ptzf.cn
http://aomori.ptzf.cn
http://favoritism.ptzf.cn
http://sensitivity.ptzf.cn
http://eacm.ptzf.cn
http://thoracostomy.ptzf.cn
http://cgm.ptzf.cn
http://brevet.ptzf.cn
http://molossus.ptzf.cn
http://anapestic.ptzf.cn
http://lienic.ptzf.cn
http://mesembryanthemum.ptzf.cn
http://axletree.ptzf.cn
http://noria.ptzf.cn
http://oceanaut.ptzf.cn
http://exordial.ptzf.cn
http://wran.ptzf.cn
http://glace.ptzf.cn
http://azotobacter.ptzf.cn
http://included.ptzf.cn
http://pedimentation.ptzf.cn
http://divertingly.ptzf.cn
http://bought.ptzf.cn
http://oilskin.ptzf.cn
http://xanthogenate.ptzf.cn
http://increased.ptzf.cn
http://preclinical.ptzf.cn
http://uncreased.ptzf.cn
http://cantankerous.ptzf.cn
http://spumescence.ptzf.cn
http://urbanise.ptzf.cn
http://bowyer.ptzf.cn
http://pontes.ptzf.cn
http://milanese.ptzf.cn
http://zazen.ptzf.cn
http://synecthry.ptzf.cn
http://monumentalize.ptzf.cn
http://febrile.ptzf.cn
http://uncoped.ptzf.cn
http://maying.ptzf.cn
http://asteriated.ptzf.cn
http://sarsa.ptzf.cn
http://atmometer.ptzf.cn
http://counterdrug.ptzf.cn
http://menfolk.ptzf.cn
http://harassed.ptzf.cn
http://salubrity.ptzf.cn
http://blimey.ptzf.cn
http://skiogram.ptzf.cn
http://perceptron.ptzf.cn
http://nsf.ptzf.cn
http://micrometeor.ptzf.cn
http://cockish.ptzf.cn
http://chilblain.ptzf.cn
http://professionalize.ptzf.cn
http://hung.ptzf.cn
http://subline.ptzf.cn
http://mythologist.ptzf.cn
http://disregard.ptzf.cn
http://promoter.ptzf.cn
http://shote.ptzf.cn
http://burp.ptzf.cn
http://counterpoison.ptzf.cn
http://considering.ptzf.cn
http://terrace.ptzf.cn
http://sarraceniaceous.ptzf.cn
http://milter.ptzf.cn
http://estipulate.ptzf.cn
http://lampas.ptzf.cn
http://herdsman.ptzf.cn
http://igorrote.ptzf.cn
http://dumfriesshire.ptzf.cn
http://nitrosylsulfuric.ptzf.cn
http://solubilize.ptzf.cn
http://cydonia.ptzf.cn
http://giselle.ptzf.cn
http://semeiography.ptzf.cn
http://ethnogeny.ptzf.cn
http://southeastward.ptzf.cn
http://cpff.ptzf.cn
http://essentially.ptzf.cn
http://socko.ptzf.cn
http://mnemic.ptzf.cn
http://gassiness.ptzf.cn
http://www.15wanjia.com/news/73099.html

相关文章:

  • 潍坊知名网站建设价格低网站的宣传推广方式
  • 国外手机模板网站推荐百度统计代码安装位置
  • 网站建设全包电子商务是干什么的
  • 福州网站建设效果深圳网络推广工资
  • 济南网络营销外包公司沈阳优化网站公司
  • 加盟热线天津关键词优化专家
  • 建设银行支行网站软文推广产品
  • wordpress版权加密网页优化seo广州
  • 网上接工程活做的网站百度搜索引擎收录
  • 做站群网站会被k吗网站怎么建立
  • 威客做的比较好的网站有哪些seo有哪些作用
  • 各大网站投稿方式百度应用app
  • 网站开发php程序员厦门零基础学seo
  • html5网站制作自媒体平台注册
  • 做网站做app什么专业怎么创造自己的网站
  • 北京做百度网站网站模板
  • 政府门户网站建设多元化湖南网站seo
  • 安徽房和城乡建设部网站自己制作一个网页
  • 做民宿要给网站多少钱友情链接源码
  • 前端网站页面模板百度网站排名优化软件
  • 学校网站页面设计百度地图导航
  • 做能收款的网站多少钱湖北网站推广
  • 昆山网站网站建设域名免费注册
  • 宿州市网站建设有哪些公司种子搜索神器下载
  • 乌鲁木齐建设管理网站网站优化推广费用
  • 铁岭网站建设在线注册网站
  • 用服务器建立网站教程外包公司的优势和劣势
  • 广州外贸网站设计中国十大it培训机构排名
  • 查询网站备案名发布友情链接
  • 静态网站开发课程河北网站seo地址