Spring Boot 使用 SMB 协议

2025/4/14

向全栈工程师迈进!

一、详述SMB协议

SMB(Server Message Block)协议是一个网络文件共享协议,它使得计算机可以在网络中共享文件、打印机以及其他资源。SMB 主要用于 Windows 操作系统,但也有其他平台(如 Linux 和 macOS)可以实现 SMB 协议的支持。

SMB 协议使用客户端-服务器模型,其中客户端向服务器请求共享文件、打印机等资源。SMB 提供了多种功能,如:

  1. 文件共享:客户端可以请求服务器共享的文件,进行读取、写入等操作。

  2. 打印机共享:客户端可以向服务器共享的打印机发送打印任务。

  3. 网络浏览:客户端可以浏览网络中可用的共享资源。

  4. 验证和权限控制:客户端在请求资源时,服务器会验证其身份,并根据权限控制访问。

SMB 协议基于请求和应答机制,客户端通过发送请求(例如文件打开、文件读取、文件写入等)与服务器进行通信,服务器根据请求进行相应的操作,然后返回结果。

1.1 SMB 协议的工作流程

  • 客户端发送请求:客户端通过网络发送 SMB 请求,请求某个资源(如共享文件夹、打印机等)。

  • 服务器验证身份:服务器通常会验证客户端的身份,如果验证成功,它会检查客户端对目标资源的访问权限。

  • 资源操作:客户端可以请求对共享资源执行各种操作,如读取文件、写入文件、删除文件等。

  • 服务器响应:服务器根据客户端的请求执行操作,并返回响应结果。

二、SMB协议的使用

2.1 实际应用示例----文件共享

假设你在一个局域网内有两台计算机,分别是 A 和 B。计算机 B 共享了一个文件夹,计算机 A 需要访问这个文件夹中的文件。

  • 计算机 B:在共享设置中,选择将某个文件夹共享出来,配置访问权限(如只读或读写权限)。

  • 计算机 A:通过文件资源管理器,输入 B 计算机的 IP 地址或计算机名,访问共享文件夹。

    • 例如,在 Windows 上,A 计算机可以通过 \\192.168.1.100\shared_folder 访问 A 的共享文件夹

在这个过程中,SMB 协议会负责客户端(计算机 A)和服务器(计算机 B)之间的通信,确保文件传输的顺利进行

以下通过 Java 访问计算机 B 上的共享文件夹(比如在计算机 B 上共享了一个文件夹 shared_folder),现在使用**JCIFS 库** ,这是一个开源的 Java 库,允许通过 SMB 协议与共享资源交互。以下是使用 JCIFS 实现计算机 A 访问计算机 B 上的共享文件夹的示例。

2.2添加依赖

XML 复制代码
<dependency>
    <groupId>jcifs</groupId>
    <artifactId>jcifs</artifactId>
    <version>1.3.17</version>
</dependency>

2.3代码

最核心的代码 SmbFile sharedFolder = new SmbFile(sharedFolderPath, auth),通过传入计算机 B 上共享文件夹的地址(要以MSB协议能看懂的格式,例如:"smb://192.168.1.100/shared_folder/")以及一些用户信息创建了一个连接共享文件夹的对象sharedFolder。然后通过这个连接的共享文件夹对象就可以读取相应的要访问的内容了。

java 复制代码
import jcifs.smb.*;

public class SMBExample {
    public static void main(String[] args) {
        String username = "yourUsername"; // 计算机 B 上的用户名
        String password = "yourPassword"; // 计算机 B 上的密码
        String sharedFolderPath = "smb://192.168.1.100/shared_folder/"; // 计算机 B 上共享文件夹的地址

        // 设置认证信息
        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", username, password);
        
        try {
            // 连接到共享文件夹
            SmbFile sharedFolder = new SmbFile(sharedFolderPath, auth);
            
            // 检查共享文件夹是否存在
            if (sharedFolder.exists()) {
                System.out.println("Successfully connected to the shared folder!");
                
                // 读取共享文件夹中的文件列表
                SmbFile[] files = sharedFolder.listFiles();
                if (files != null) {
                    for (SmbFile file : files) {
                        System.out.println("Found file: " + file.getName());
                    }
                }
            } else {
                System.out.println("Shared folder does not exist.");
            }
        } catch (SmbException e) {
            System.out.println("SMB Exception: " + e.getMessage());
        } catch (Exception e) {
            System.out.println("Exception: " + e.getMessage());
        }
    }
}

2025/4/14

dream dream

相关推荐
岁忧1 分钟前
(LeetCode 面试经典 150 题) 200. 岛屿数量(深度优先搜索dfs || 广度优先搜索bfs)
java·c++·leetcode·面试·go·深度优先
喜葵9 分钟前
前端安全防护深度实践:从XSS到供应链攻击的全面防御
前端·安全·xss
_r0bin_14 分钟前
分片上传-
前端·javascript·状态模式
东北南西17 分钟前
手写React状态hook
前端·javascript·react.js
诗书画唱18 分钟前
【前端教程】JavaScript DOM 操作实战案例详解
开发语言·前端·javascript
lypzcgf19 分钟前
Coze源码分析-资源库-删除提示词-前端源码
前端·typescript·react·ai应用·coze·coze源码分析·智能体平台
代码青铜21 分钟前
【实战指南】Cursor前端+Zion后端:10分钟打造能收款的AI商业应用MVP
前端·人工智能
liliangcsdn40 分钟前
结合prompt分析NodeRAG的build过程
java·服务器·人工智能·数据分析·知识图谱
quan26311 小时前
Vue实践篇-02,AI生成代码
前端·javascript·vue.js
GIS之路1 小时前
GDAL 读取影像元数据
前端