使用window的SMB协议实现局域网文件传输——java版
前言
简述一下SMB协议
SMB(Server Message Block)通信协议是微软(Microsoft)和英特尔(Intel)在1987年制定的协议,主要是作为Microsoft网络的通讯协议(是一种程序级网络传输协议)。SMB 是在会话层(session layer)和表示层(presentation layer)以及小部分应用层(application layer)的协议。SMB使用了NetBIOS的应用接口。
SMB协议是基于TCP-NETBIOS下,一般端口为443、139。
场景
将局域网中的共享文件,copy到本机中
使用
1. win新建用户,设置账号密码,给用户授权文件访问权限等。(不做赘述)
2. Java程序SMB依赖包引入:
<dependency><groupId>jcifs</groupId><artifactId>jcifs</artifactId><version>1.3.17</version>
</dependency>
3. 基于SMB协议操作远程文件资源工具类
SMB地址写法:smb://用户名:密码@远程ip/地址/(或有无文件名)(注:如只获取文件夹后缀一定有“/”)
4. 工具类
/*** @Description: SMB协议共享文件工具类* @Author: Chen.lang* @Date: 2020-10-19 10:12*/
public class SmbFileUtils {/*** @Description: 从远程共享文件夹中读取并存放本地* @Param: [smbMachine, localPath]* @Return: java.io.File* @Author: Chen.lang* @Date: 2020/10/19 10:16*/public static File readFromSmb(String smbMachine, String localPath) {File localfile = null;InputStream is = null;OutputStream os = null;try {//远程读取文件SmbFile rmiFile = new SmbFile(smbMachine);String filename = rmiFile.getName(); //获取文件名is = new BufferedInputStream(new SmbFileInputStream(rmiFile)); //对文件进行读取//将远程文件写到本地localfile = new File(localPath + File.separator + filename); //将远程拷贝的文件,指定到具体的本地的具体路径os = new BufferedOutputStream(new FileOutputStream(localfile));int length = rmiFile.getContentLength(); //获取文件的内容大小byte[] buffer = new byte[length];is.read(buffer);os.write(buffer); //开始写} catch (Exception e) {e.printStackTrace();} finally {try {is.close();os.close();} catch (IOException e) {e.printStackTrace();}}return localfile;}/*** 读取共享文件夹下的所有 文件/文件夹** @param remoteUrl*/public static SmbFile[] getSharedFileList(String remoteUrl) {SmbFile smbFile;SmbFile[] smbFiles = new SmbFile[]{};try {smbFile = new SmbFile(remoteUrl);if (!smbFile.exists()) {System.out.println("no such folder");} else {smbFiles = smbFile.listFiles();}} catch (MalformedURLException e) {e.printStackTrace();} catch (SmbException e) {e.printStackTrace();}return smbFiles;}/*** @Description: 复制文件夹* @Param: [sourceDir, targetDir]* @Return: java.lang.String* @Author: Chen.lang* @Date: 2020/10/19 10:38*/public static String copyDirectory(String sourceDir, String targetDir) throws Exception {(new File(targetDir)).mkdirs(); //创建目标目录try {SmbFile smbFile = new SmbFile(sourceDir);SmbFile[] file = smbFile.listFiles();long startTime = System.currentTimeMillis(); //开始时间for (int i = 0; i < file.length; i++) {if (file[i].isFile()) {SmbFile sourceFile = file[i];//getAbsolutePath() 获取文件的绝对路径File targetFile = new File(new File(targetDir).getAbsolutePath() +File.separator + file[i].getName());copyFile(sourceFile, targetFile);}if (file[i].isDirectory()) {// 准备复制的源文件夹String dir1 = sourceDir + "/" + file[i].getName();System.out.println(dir1);// 准备复制的目标文件夹String dir2 = targetDir + "/" + file[i].getName();copyDirectory(dir1, dir2);}}long endTime = System.currentTimeMillis();//结束时间double time = (endTime - startTime) / 1000.000;System.out.println("文件复制完成,耗时:" + time + "s");} catch (MalformedURLException e) {e.printStackTrace();}return null;}/*** @Description: 复制文件* @Param: [sourceFile, targetFile]* @Return: java.lang.String* @Author: Chen.lang* @Date: 2020/10/19 10:38*/public static String copyFile(SmbFile sourceFile, File targetFile) {File file = targetFile;SmbFile smbFile = sourceFile;try {if (file.exists()) {System.out.println(file.getName()+"已存在!");} else if (smbFile.exists()) {BufferedInputStream bis = new BufferedInputStream(new SmbFileInputStream(smbFile));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));int len = 0;byte[] bytes = new byte[1024];while((len=bis.read(bytes)) != -1){bos.write(bytes,0,len);}bos.close();bis.close();}} catch (Exception e) {e.printStackTrace();}return null;}}
使用window的SMB协议实现局域网文件传输——java版相关推荐
- 利用SMB协议实现局域网内设备文件的共享
文章目录 参考资料 说明 步骤1:[windows]开启SMB协议 步骤2:[windows]创建新的用户账号 步骤3:[windows]共享文件夹 属性-共享-共享 属性-共享-高级共享 步骤4:[ ...
- android盒子共享,Android使用SMB协议共享电脑内文件方法
SMB协议是什么?SMB协议有什么用?SMB是一种网络通信协议,使用SMB协议可以实现不同类型设备之间数据传递.例如,文件.打印机共享也是基于这个协议.在Android平台我们最常使用的是用手机.平板 ...
- 小试跨平台局域网文件传输工具NitroShare,几点感想
随着电脑系统国产化的推进,单位用的OA系统已转移到国产电脑上了,但是国产电脑上的操作系统基于Linux,软件商店里可选的应用软件还不够多,功能也还有待提高.为了提高处理效率,经常需要把文件从国产电脑传 ...
- python 编写一个局域网文件传输的程序
可以使用 Python 的 socket 模块来编写一个局域网文件传输程序. 首先,你需要在服务端程序中创建一个 socket 对象,并绑定到特定的 IP 地址和端口上.然后,服务端可以通过调用 so ...
- 局域网传输还在用飞鸽?还在用QQ,其实Python也可以实现类似的功能!Python基于scoket实现多路复用TCP局域网文件传输
局域网传输的基本信息 1.IO是什么? ⦁定义 ⦁ 阻塞IO ⦁ 非阻塞IO 2.IO多路复用 定义 select具体用法 3.实现多路复用局域网文件传输 server.py client.py Fi ...
- 局域网文件传输神器Feem(Feem使用教程)
局域网文件传输神器Feem 官网地址,下载后一路安装就可以了 有免费版(限制人数下载).也有收费版 另一台局域网内的电脑,浏览器打开http://192.168.55.2:3456 就可以直接传输文件 ...
- java smb下载文件代码_java利用SMB共享文件进行局域网文件的下载及apk升级
最近在学习android,领导想做一个测试利用局域网进行电视apk的自动升级程序,最新代码是放在本地局域网电脑上面的,在此写下代码调试过程中遇到的问题及解决方法:一开始用想用FTPClient和Htt ...
- C#实现HTTP协议:多线程文件传输
很多人都有过使用网络蚂蚁或网络快车互联网文件的经历,这些软件的使用可以大大加速互联网上文件的传输速度,减少文件传输的时间.这些软件为什么有如此大的魔力呢?其主要原因是这些软件都采用了多线程下载和断点续 ...
- 标准c语言局域网文件传输,winsocket局域网文件传输系统源代码(C语言)+winsocket.doc...
winsocket局域网文件传输系统源代码(C语言)winsocket 翁跺吨郑蛮杨消痴线豆电眩也行却猖革甥花顶豹扣损纽眺福圈汀森饮翁篮玉鳃将汇铆梗敬剑砷香祝景驰疆赋恢爽宛关唾上盼唁墒酗箭抒厚檬毅袭眉 ...
最新文章
- unicode utf8 转换 php,php实现utf-8转unicode函数分享
- 网络推广外包浅析当下网站优化处于健康状态有利于网络推广外包
- 盖茨推荐人人该读的九本书
- EL表达式隐含对象和jstl命名冲突,jstl无法取的值
- css 文本属性详细总结
- 【图文详解】第一个Java程序HelloWorld详解,写Java程序需要注意什么
- 判断程序是否运行在虚拟机中的代码
- php多进程有什么用,有关php多进程的用法举例
- boost库 python_Boost.Python简介-阿里云开发者社区
- 【剑指Offer】07变态跳台阶
- sed与正则用法收集
- 物联网是自动化还是计算机,物联网:自动化家里的一切
- 高通联机修改IMEI等参数的相关解析
- BootStrap-datepicker日期插件
- 【UCSC Genome Browser】- Genes and Gene Predictions - NCBI RefSeq
- 【swarm测试极简指南】如何获得bzz奖励?0.6.2版本手动安装指南
- AI燃到爆!中关村人工智能产业论坛十位大咖演讲干货
- Zend框架:Zend_Nosql_Mong​​o组件建议
- Ubuntu打开WPS ofifice卡顿、无法进行编辑操作解决办法
- octagam® 10%治疗皮肌炎患者的ProDERM研究达到主要终点的阳性结果将在ACR 2020年会上呈报