smb服務檢測

 開源包,http://jcifs.samba.org/.
複製一篇文章.

用JAVA訪問共享文件系統

前言

在Microsoft 網 絡 系 統 中,SMB(Server Message Block, 服 務 信 息 塊) 協 議 是Windows for Workgroup(WfWg)、Windows 95、Windows NT 和LanManager 用 來 實 現 共 享 局 域 網 上 文 件 和 打 印 機 的 協 議。 對 於 利 用Linux 和Windows NT 構 建 的 局 域 網 來 說,Samba 就 是 爲Linux 提 供 的SMB 客 戶 程 序/ 服 務 器 程 序 的 軟 件 包, 其 功 能 是 實 現Windows 和Linux 互 相 共 享 對 方 的 磁 盤 空 間 和 打 印 機。通用網絡文件系統簡稱CIFS,它事實上是windows平臺文件共享的標準協議,它是windows explorer,網絡鄰居和映射網絡驅動器的底層實現協議。JAVA具有天然的平臺無關性,使用JAVA可以訪問任何類型的服務器或客戶機上的共享文件 系統,並且編寫的軟件產品可以運行於任何平臺,因此用JAVA訪問共享文件系統在企業應用中具有得天獨厚的優勢。

JAVA中的CIFS實現

Jcifs是CIFS在JAVA中的一個實現,是samba組織本着linux的精神,負責維護開發的一個開源項 目。這個項目專注於使用java語言對cifs協議的設計和實現。他們將jcifs設計成爲一個完整的,豐富的,具有可擴展能力且線程安全的客戶端庫。這 一庫可以應用於各種java虛擬機訪問遵循CIFS/SMB網絡傳輸協議的網絡資源。類似於java.io.File的接口形式,在多線程的工作方式下被 證明是有效而容易使用的。目前jcifs的最新版本是jcifs-0.8.0b,你可以在本文最後列出的參考資料中獲得下載這一類庫的網址,這一版本還支 持分佈式的文件系統,本文尚不涉及這一內容。

JAVA/CIFS程序設計

如果你曾經使用過java的文件操作功能,那麼你將很容易掌握jcifs的開發方法。Jcifs通過類似如下的資源url定位一個資源:

smb://guest:[email protected]/share/a.txt

這個url的開始部分smb:// 說明了這是一個smb類型的url;接下來的guest和1234分別是訪問共享資源的用戶名稱和密碼;@後面是要訪問的資源的主機名或IP地址。最後是資源的共享文件夾名稱和共享資源名。

在JAVA程序中,使用如下方式獲得一個遠程共享文件的句柄:

SmbFile file = new SmbFile("smb://guest:[email protected]/share/a.txt");

這裏的句柄不僅限於遠程的共享文件,還可能是共享文件夾。isFile()方法和isDirectory()用來判 斷這個句柄對應的資源的真實屬性。如果是共享文件夾,通過調用它的list()方法將獲得其中資源的列表。List方法支持過濾器機制,有兩種過濾器可供 使用,一種是SmbFileFilter,另一種是SmbFilenameFilter,這兩個在jcifs中作爲接口出現,你可以根據自己的需要派生出 個性化的過濾器,實現接口中的accept方法,以滿足不同業務的需求。

SmbFileInputStream是smb文件的輸入流,它的功能是以流的方式打開一個SmbFile:

SmbFileInputStream in = new SmbFileInputStream(file);

SmbFileInputStream提供read方法,你可以從這個流中讀出遠程文件全部的內容。

至此,你已經掌握了java訪問smb文件系統的基本方法。

SmbFileOutputStream是smb文件的輸入流,可以向遠程文件系統通過smb寫入數據,方法與上面類似,不再贅述。

本文後面附帶的源代碼是一個完整的例子,它完成功能很簡單,就是將另一臺電腦上指定共享文件夾下的某些文件拷貝到本機的指定目錄下。通過這個例子,相信你很容易將它移植到你的開發產品中。

第一步,設置運行環境。將源代碼解壓縮,將lib目錄下的名稱爲jcifs-0.8.0b.jar的文件加入到你的操作系統的classpath中,使示例程序運行時能夠找到這個庫。

第二步,在另一臺計算機上建立名稱爲share的共享文件夾,用戶名爲guest,密碼也爲guest。假設這臺計算機的ip地址是192.168.0.2。

第三步,在剛纔建立的共享文件夾下放置兩個文件,名稱分別爲hello.txt,bye.txt。文件的內容無所謂。

第三步,在本地計算機上的C盤跟目錄下建立一個名稱爲tmp的空目錄,置此目錄可寫。

第四步,編譯運行Sample1.java,並運行:

Java Sample1 192.168.3.52 guest guest /share/ c:/tmp/

檢查c:/tmp文件夾,會發現hello.txt這個文件被複制到了本機,而bye.txt沒有被複制,因爲Sample1.java中使用了過濾器,僅允許名稱爲hello開頭的文件被拷貝。

後記

對共享文件系統的訪問是內部辦公系統等涉及到文件遷移的軟件產品開發過程中不可迴避的課題,jCifs是一套針對這一課題完整而強大的解決方案,通過它你可以實現對任何共享文件系統的訪問。

發佈了74 篇原創文章 · 獲贊 10 · 訪問量 56萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章