App下載

在 Java 中使用 SMB 處理遠程服務(wù)器中的共享文件

怪味少女 2021-08-25 11:13:28 瀏覽數(shù) (7467)
反饋

介紹

我們習(xí)慣于使用共享文件,其中共享僅限于某些域中的用戶或某些用戶。遠程應(yīng)用程序需要訪問共享資源并在共享位置執(zhí)行添加、刪除資源等操作。

服務(wù)器具有共享資源,這些資源通常在 Windows 機器中使用服務(wù)器消息塊 (SMB) 協(xié)議 ( Server Message Block )。SMB 協(xié)議使應(yīng)用程序能夠訪問遠程服務(wù)器上的文件,以及允許客戶端應(yīng)用程序打開、讀取、移動、更新遠程服務(wù)器上的文件的其他資源。該資源僅限于某些用戶。用戶需要傳遞憑據(jù)才能訪問共享資源。用戶可以在共享資源上進行的活動在共享權(quán)限中定義。讓我們假設(shè)用戶具有讀和寫權(quán)限。

在本文中,我將為大家演示一個例子,其中應(yīng)用程序需要使用一個簡單的 Java 應(yīng)用程序與 Windows 服務(wù)器計算機中的共享文件進行交互。用例做出以下假設(shè):

  • 服務(wù)器是一臺 Windows 機器。
  • 存在名為“ ?Test?”的本地用戶,該用戶的密碼為“ ?Password?”。
  • 共享位置是“ 127.0.0.0.1\temp ”。
  • 用戶“ ?Test?”有權(quán)訪問共享位置“ temp ”,該位置可以位于 IP 為“ ?127.0.0.1?”的計算機中的任何位置。
  • 客戶端應(yīng)用程序可以訪問網(wǎng)絡(luò)。

代碼庫

我們正在設(shè)計的應(yīng)用程序是在 Java 中使用 Maven 進行構(gòu)建和依賴項管理。我正在使用 JCIFS,這是一個實現(xiàn)CIFS/SMB 網(wǎng)絡(luò)協(xié)議的開源客戶端庫。該庫可從 Maven Repository 獲得。

依賴關(guān)系顯示在以下pom.xml文件中:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>fileShare</groupId>
    <artifactId>fileShare</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>7</source>
                    <target>7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>jcifs</groupId>
            <artifactId>jcifs</artifactId>
            <version>1.3.17</version>
        </dependency>
    </dependencies>
</project>

目前,該應(yīng)用程序有一個文件Main.java,內(nèi)容如下:

import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import java.net.MalformedURLException;

public class Main {
    public static void main(String[] args) {
        String url = "smb://127.0.0.1/test/";
        String userName = "test";
        String password = "password";
        String domain = null;
        NtlmPasswordAuthentication auth = 
              new NtlmPasswordAuthentication(null, userName, password);
        try {
            doRecursiveLookup(new SmbFile(url, auth));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
    /*
    * Recursively scans through the folder for files and prints the name of folder and file
    */
    public static void doRecursiveLookup(SmbFile smb) {
        try {
            if (smb.isDirectory()) {
                System.out.println(smb.getName());
                for (SmbFile f : smb.listFiles()) {
                    if (f.isDirectory()) {
                        doRecursiveLookup(f);
                    } else {
                        System.out.println("\t:" + f.getName());
                    }
                }
            } else {
                System.out.println("\t:" + smb.getName());
            }
        } catch (SmbException e) {
            e.printStackTrace();
        }
    }
}

這里,main方法使用for smb協(xié)議的url模式,并在第8行指向共享位置。局部變量for ?userName,password?和?domains?在第9到11行初始化,并在第13行驗證用戶,此時應(yīng)用程序已成功連接到共享文件夾。

應(yīng)用程序?SmbFile?在第 15 行創(chuàng)建一個對象并將該文件夾傳遞給?doRecursiveLookup(..)?第 24 行調(diào)用的方法。該方法簡單地遍歷共享位置中的所有文件和文件夾,并以遞歸方式在控制臺中打印名稱。請注意,?SmbFile?文件或文件夾的對象是相同的,并且?.isDirectory()?方法用于測試范圍內(nèi)的對象是文件還是文件夾。


0 人點贊