2025/4/14
向全栈工程师迈进!
一、详述SMB协议
SMB(Server Message Block)协议是一个网络文件共享协议,它使得计算机可以在网络中共享文件、打印机以及其他资源。SMB 主要用于 Windows 操作系统,但也有其他平台(如 Linux 和 macOS)可以实现 SMB 协议的支持。
SMB 协议使用客户端-服务器模型,其中客户端向服务器请求共享文件、打印机等资源。SMB 提供了多种功能,如:
文件共享:客户端可以请求服务器共享的文件,进行读取、写入等操作。
打印机共享:客户端可以向服务器共享的打印机发送打印任务。
网络浏览:客户端可以浏览网络中可用的共享资源。
验证和权限控制:客户端在请求资源时,服务器会验证其身份,并根据权限控制访问。
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添加依赖
<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。然后通过这个连接的共享文件夹对象就可以读取相应的要访问的内容了。
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