· SMB 1.0

  SMB1.0协议由于在文件共享传输过程中存在的传输效率低以及传输空间小等缺陷逐渐被抛弃了。为了更好的实现网络中文件的共享,在SMB1.0基础上开发了新的网络文件传输协议,即SMB2.0。

  · SMB 2.0

  · 相比SMB1.0,提供了文件共享传输过程中的传输效率、文件缓存空间以及文件并发传输等问题。

  · SMB2.0加入了对文件传输过程中的安全性保障机制,使得文件共享传输过程中可以避免信息截取等恶意攻击。

  · SMB 3.0

  · SMB3.0在Windows Server 2012操作系统中出现,与Windows 8客户端共同工作。

  · SMB3.0极大的提升了性能、可靠性和安全性。

  · 当它与Windows Storage Spaces(Windows Server 2012的一个功能,将普通的磁盘虚拟化为高性能、高可用性的存储)结合时,SMB3.0可以使用廉价的直连存储(DAS)、JBOD或RBOD,创建一个特定的NAS设备。

  · Maven 依赖

  SMB2.0和SMB3.0协议与SMB1.0协议依赖的JAR不一样,SMB1.0依赖jcifs:jcifs:1.3.17,SMB2.0和SMB3.0依赖com.hierynomus:smbj。

<dependency><groupId>com.hierynomus</groupId><artifactId>smbj</artifactId><version>0.10.0</version>
</dependency>
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version>
</dependency>

  · SMB 2.0和3.0协议工具类

package com.arhorchin.securitit.protocol.smb;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.EnumSet;import org.apache.log4j.Logger;import com.hierynomus.msdtyp.AccessMask;
import com.hierynomus.msfscc.FileAttributes;
import com.hierynomus.mssmb2.SMB2CreateDisposition;
import com.hierynomus.mssmb2.SMB2CreateOptions;
import com.hierynomus.mssmb2.SMB2ShareAccess;
import com.hierynomus.smbj.SMBClient;
import com.hierynomus.smbj.auth.AuthenticationContext;
import com.hierynomus.smbj.connection.Connection;
import com.hierynomus.smbj.session.Session;
import com.hierynomus.smbj.share.DiskShare;
import com.hierynomus.smbj.share.File;public class SmbV23Util {/*** logger.*/private static Logger logger = Logger.getLogger(SmbV23Util.class);/*** SMB下载文件.* @param remoteIp 远程IP.* @param remoteUrl 远程地址.* @param username 远程用户.* @param password 远程密码.* @param filename 远程文件.* @return 共享文件.*/public static byte[] smbDownload(String remoteIp, String remoteUrl, String username, String password,String filename) {File shareFile = null;InputStream shareIs = null;ByteArrayOutputStream shareBaos = null;SMBClient client = null;Session session = null;DiskShare diskShare = null;Connection connection = null;AuthenticationContext authenticationContext = null;try {client = new SMBClient();connection = client.connect(remoteIp);// 创建连接会话.authenticationContext = new AuthenticationContext(username, password.toCharArray(), null);session = connection.authenticate(authenticationContext);// 操作共享文件.diskShare = (DiskShare) session.connectShare(remoteUrl);// 获取文件流.上传文件.shareFile = diskShare.openFile(filename, EnumSet.of(AccessMask.GENERIC_READ),EnumSet.of(FileAttributes.FILE_ATTRIBUTE_NORMAL), SMB2ShareAccess.ALL,SMB2CreateDisposition.FILE_OPEN_IF, EnumSet.noneOf(SMB2CreateOptions.class));shareIs = shareFile.getInputStream();// 读取文件并下载.shareBaos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];while (shareIs.read(buffer) != -1) {shareBaos.write(buffer);buffer = new byte[1024];}return shareBaos.toByteArray();} catch (Exception ex) {logger.error(ex);return null;} finally {try {if (null != shareIs) {shareIs.close();}if (null != diskShare) {diskShare.close();}if (null != session) {session.close();}if (null != client) {client.close();}} catch (IOException ex) {logger.error(ex);return null;}}}/*** SMB上传文件.* @param remoteIp 远程IP.* @param remoteUrl 远程地址.* @param username 远程用户.* @param password 远程密码.* @param filename 远程文件.* @param fileBytes 待上传文件.* @return 上传结果.*/public static boolean smbUpload(String remoteIp, String remoteUrl, String username, String password,String filename, byte[] fileBytes) {File shareFile = null;String[] filepathArr = null;String vfilepath = null;OutputStream shareOs = null;SMBClient client = null;Session session = null;DiskShare diskShare = null;Connection connection = null;AuthenticationContext authenticationContext = null;try {client = new SMBClient();connection = client.connect(remoteIp);// 创建连接会话.authenticationContext = new AuthenticationContext(username, password.toCharArray(), null);session = connection.authenticate(authenticationContext);// 操作共享文件.diskShare = (DiskShare) session.connectShare(remoteUrl);if (filename.contains("/") || filename.contains("\\")) {filename = filename.replaceAll("\\\\", "/");filepathArr = filename.split("/");vfilepath = "";for (int index = 0; index < filepathArr.length - 1; index++) {vfilepath += filepathArr[index] + "/";if (!diskShare.folderExists(vfilepath)) {diskShare.mkdir(vfilepath);}}}// 获取文件流.上传文件.shareFile = diskShare.openFile(filename, EnumSet.of(AccessMask.GENERIC_WRITE),EnumSet.of(FileAttributes.FILE_ATTRIBUTE_NORMAL), SMB2ShareAccess.ALL,SMB2CreateDisposition.FILE_OPEN_IF, EnumSet.noneOf(SMB2CreateOptions.class));shareOs = shareFile.getOutputStream();shareOs.write(fileBytes);return true;} catch (Exception ex) {logger.error(ex);return false;} finally {try {if (null != shareOs) {shareOs.close();}if (null != diskShare) {diskShare.close();}if (null != session) {session.close();}if (null != client) {client.close();}} catch (IOException ex) {logger.error(ex);return false;}}}/*** SMB删除文件.* @param remoteIp 远程IP.* @param remoteUrl 远程地址.* @param username 远程用户.* @param password 远程密码.* @param filename 远程文件.* @return 删除结果.*/public static boolean smbDelete(String remoteIp, String remoteUrl, String username, String password,String filename) {SMBClient client = null;Session session = null;DiskShare diskShare = null;Connection connection = null;AuthenticationContext authenticationContext = null;try {client = new SMBClient();connection = client.connect(remoteIp);// 创建连接会话.authenticationContext = new AuthenticationContext(username, password.toCharArray(), null);session = connection.authenticate(authenticationContext);// 操作共享文件.diskShare = (DiskShare) session.connectShare(remoteUrl);// 获取文件流.上传文件.diskShare.rm(filename);return true;} catch (Exception ex) {logger.error(ex);return false;} finally {try {if (null != diskShare) {diskShare.close();}if (null != session) {session.close();}if (null != client) {client.close();}} catch (IOException ex) {logger.error(ex);return false;}}}}

  测试类如下:

package com.arhorchin.securitit.protocol.smb;import java.io.File;import org.apache.commons.io.FileUtils;import com.arhorchin.securitit.protocol.smb.SmbV23Util;public class SmbV23UtilTester {public static void main(String[] args) throws Exception {String remoteIp = "127.0.0.1";String remoteUrl = "Storage";String username = "Securitit";String password = "Wang@881216";String filename = "demo.png";byte[] fileBytes = FileUtils.readFileToByteArray(new File("C:/Users/Administrator/Downloads/个人文件/demo.png"));// 上传文件.SmbV23Util.smbUpload(remoteIp, remoteUrl, username, password, filename, fileBytes);// 下载文件.byte[] downBytes = SmbV23Util.smbDownload(remoteIp, remoteUrl, username, password, filename);System.out.println(downBytes.length);// 删除文件.SmbV23Util.smbDelete(remoteIp, remoteUrl, username, password, filename);}}

  上面测试类执行的同时,观察共享文件夹,可以看到:

  1) 共享文件夹首先上传了一个文件demo.pdf。

  2) 测试类从共享文件夹下载了刚才上传的文件,并输出了文件长度。

​  3) 共享文件夹内的文件被删除掉了。

  · 总结

  · Windows 8及以上版本操作系统,直接提供了SMN2.0和SMB3.0,无需重新开启。

  · SmbV23Util工具类可以直接复制使用,已经经过简单测试,只需按照文中要求导入Maven依赖即可。

  · SmbV23Util中写法已经避免了用户名和密码中包含特殊字符的问题,如果使用完整地址方式访问,无法有效处理用户名和密码中的特殊字符。

SMB 2.0和3.0协议 Java应用相关推荐

  1. java共享文件夹SMB1服务报错jcifs.smb.SmbException: Failed to connect: 0.0.0.0<00>/122.168.23.26

    java共享文件处理 两台电脑,其中一台开启共享文件(局域网环境).利用jcifs-1.3.19.jar包. String ip = "192.168.1.58";String u ...

  2. jcifs.smb.SmbException: Failed to connect: 0.0.0.000/IP 解决方案

    因为业务原因,现在内网系统使用共享文件夹方式进行文件的输入输出,Java开发,使用的Jar包为jcifs,在本地测试完全正常,部署到正式环境后出现: jcifs.smb.SmbException: F ...

  3. 安全修复之Web——【中危】启用了不安全的TLS1.0、TLS1.1协议

    安全修复之Web--[中危]启用了不安全的TLS1.0.TLS1.1协议 背景 日常我们开发时,会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章 ...

  4. Eclipse 3.5 Classic+Tomcat 6.0+MySql 5.5搭建java web开发环境

    Eclipse 3.5 Classic+Tomcat 6.0+MySql 5.5搭建java web开发环境 对于初学者来说,如果没有接触过java web开发的话,搭建开发环境将是一个门槛.以前一直 ...

  5. 独家专访:SequoiaDB 3.0 版本正式发布!协议级完整兼容MySQL!

    SequoiaDB 3.0 版本正式发布!协议级完整兼容MySQL! 标签:SequoiaDB 3.0,MySQL,OLTP SequoiaDB巨杉数据库 3.0,在产品GA发布后,经过近半年在金融级 ...

  6. Java黑皮书课后题第5章:*5.30(金融应用:复利值)假设你每月在储蓄账户上多存100美元,年利率为5%,那么每月利率是0.05 / 12 = 0.00417。编写程序提示用户输入数据显示定月钱数

    5.30(金融应用:复利值)假设你每月在储蓄账户上多存100美元,年利率为5%,那么每月利率是0.05 / 12 = 0.00417.编写程序提示用户输入数据显示定月钱数 题目 题目概述 破题 代码 ...

  7. P3-weixin-2.0.1 版本发布,JAVA微信插件框架

    P3-weixin-2.0.1版本发布(JAVA微信插件框架) P3-Weixin是轻量级Java插件开发框架,采用主流JAVA技术,集成强大代码生成器,增删改查一键生成,封装统一后台管理系统,不仅适 ...

  8. PoiDocxDemo【Android将表单数据生成Word文档的方案之二(基于Poi4.0.0),目前只能java生成】...

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个是<PoiDemo[Android将表单数据生成Word文档的方案之二(基于Poi4.0.0)]>的扩展,上一篇是根 ...

  9. IoT:BLE4.0教程一 蓝牙协议连接过程与广播分析

    IoT:BLE4.0教程一 蓝牙协议连接过程与广播分析 1.蓝牙简介 什么是蓝牙4.0 蓝牙无线技术是使用范围最广泛的全球短距离无线标准之一,蓝牙4.0版本涵盖了三种蓝牙技术,即传统蓝牙.高速蓝牙和低 ...

最新文章

  1. 设置linux初始root密码
  2. WINDOWS SERVER 2003从入门到精通之“域控制器安全策略”打开错误的解决方法
  3. 【 Vivado 】基本的时序约束、分析的概念
  4. 2.2.4 操作系统之作业/进程调度算法(FCFS先来先服务、SJF短作业优先、HRRN高响应比优先)
  5. android自定义控件 几种方式总结
  6. 模拟电路概念知识体系梳理(基础部分)
  7. php yaf框架和icon,php中Yaf框架是什么?
  8. Ubuntu16.04下在Anaconda里面安装opencv
  9. 深入理解对象的数据属性与访问器属性及属性间相互转换
  10. jsp中9个内置对象与servlet对应关系及四个作用域
  11. 【算法】常见排序算法效率比较和代码
  12. 目标追踪论文之狼吞虎咽(5):基于张量的图嵌入半监督学习及其在判别式目标追踪的应用
  13. log4j配置文件中的变量
  14. 手机连接ftp文件服务器,手机轻松玩转小白文件管理器远程FTP教程——x-plo
  15. java webp 图片处理_Java处理Webp图片格式转换的示例代码
  16. Postgresql - cursor介绍
  17. java 调用jar_在Java程序中执行另一个jar
  18. 怎样理解心藏神,肝藏魂,脾藏意,肺藏魄,肾藏精志?
  19. Qt - 从零到壹的 打地鼠 游戏
  20. Linux虚拟机不显示IP地址解决方法(亲测有效)

热门文章

  1. ButterKnife(黄油刀) 使用方法总结
  2. html css聊天窗口气泡,CSS实现短信气泡对话框
  3. 个人html文件管理,个人文件管理
  4. Java编程基础--循环结构语句
  5. MVP的使用 + 闪屏页广告
  6. 0基础教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)
  7. 九、(机器学习)-Tensorflow算法之全连接层
  8. Unity模拟行星轨道(二)
  9. Java设计原则——开闭原则
  10. 自定义VS快捷键及常用快捷键(VS2015)