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

相关推荐
志尊宝4 小时前
Vue3 零基础每日笔记(071):暗黑模式与主题切换——CSS 变量 + Element Plus 暗黑方案
前端·css·笔记·vue·html·前端开发·软件开发
Wx-bishekaifayuan4 小时前
springboot汉中旅游服务平台41442-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
code2cat5 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程
WeiXin_DZbishe5 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
泡茶喝茶写代码5 小时前
A股量化数据工程:从 REST 接口到策略信号(第 18 篇):放量缩量异动扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
刘发财5 小时前
前端如何生成10000页PDF文件?
前端·javascript·开源
WeiXin_DZbishe5 小时前
基于Springboot+AI的kuall音乐广场的设计与实现-计算机毕设 附源码【课程设计】12715
vue.js·人工智能·spring boot·后端·python·php·课程设计
wewowilling5 小时前
认识微服务
java·运维·微服务·springcloud
A接拉起0075 小时前
2026 年 JavaScript 开发者需要了解的知识
前端·javascript·后端