日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

基于SMB协议的共享文件读写 博客分类: Java

發(fā)布時(shí)間:2025/3/19 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于SMB协议的共享文件读写 博客分类: Java 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基于SMB協(xié)議的共享文件讀寫

博客分類:
  • Java
一、SMB協(xié)議
SMB協(xié)議是基于TCP-NETBIOS下的,一般端口使用為139,445。
服務(wù)器信息塊(SMB)協(xié)議是一種IBM協(xié)議,用于在計(jì)算機(jī)間共享文件、打印機(jī)、串口等。SMB 協(xié)議可以用在因特網(wǎng)的TCP/IP協(xié)議之上,也可以用在其它網(wǎng)絡(luò)協(xié)議如IPX和NetBEUI 之上。
  SMB 一種客戶機(jī)/服務(wù)器、請(qǐng)求/響應(yīng)協(xié)議。通過 SMB 協(xié)議,客戶端應(yīng)用程序可以在各種網(wǎng)絡(luò)環(huán)境下讀、寫服務(wù)器上的文件,以及對(duì)服務(wù)器程序提出服務(wù)請(qǐng)求。此外通過 SMB 協(xié)議,應(yīng)用程序可以訪問遠(yuǎn)程服務(wù)器端的文件、以及打印機(jī)、郵件槽(mailslot)、命名管道(named pipe)等資源。
  在 TCP/IP 環(huán)境下,客戶機(jī)通過 NetBIOS over TCP/IP(或 NetBEUI/TCP 或 SPX/IPX)連接服務(wù)器。一旦連接成功,客戶機(jī)可發(fā)送 SMB 命令到服務(wù)器上,從而客戶機(jī)能夠訪問共享目錄、打開文件、讀寫文件,以及一切在文件系統(tǒng)上能做的所有事情。
  從 Windows 95 開始,Microsoft Windows 操作系統(tǒng)(operating system)都包括了客戶機(jī)和服務(wù)器 SMB 協(xié)議支持。Microsoft 為 Internet 提供了 SMB 的開源版本,即通用 Internet 文件系統(tǒng) (CIFS)。與現(xiàn)有 Internet 應(yīng)用程序如文件傳輸協(xié)議(FTP)相比, CIFS 靈活性更大。對(duì)于 UNIX 系統(tǒng),可使用一種稱為 Samba 的共享軟件。
二、CIFS(Common Internet File System) 協(xié)議
CIFS 是一個(gè)新提出的協(xié)議,它使程序可以訪問遠(yuǎn)程Internet計(jì)算機(jī)上的文件并要求此計(jì)算機(jī)的服務(wù)。CIFS 使用客戶/服務(wù)器模式。客戶程序請(qǐng)求遠(yuǎn)在服務(wù)器上的服務(wù)器程序?yàn)樗峁┓?wù)。服務(wù)器獲得請(qǐng)求并返回響應(yīng)。CIFS是公共的或開放的SMB協(xié)議版本,并由Microsoft使用。SMB協(xié)議現(xiàn)在是局域網(wǎng)上用于服務(wù)器文件訪問和打印的協(xié)議。象SMB協(xié)議一樣,CIFS在高層運(yùn)行,而不象TCP/IP協(xié)議那樣運(yùn)行在底層。CIFS可以看做是應(yīng)用程序協(xié)議如文件傳輸協(xié)議和超文本傳輸協(xié)議的一個(gè)實(shí)現(xiàn)。
三、NETBios協(xié)議
Netbios (網(wǎng)絡(luò)基本輸入/輸出系統(tǒng))最初由 IBM,Sytek 作為API開發(fā),使用戶軟件能使用局域網(wǎng)的資源。自從誕生,Netbios成為許多其他網(wǎng)絡(luò)應(yīng)用程序的基礎(chǔ)。嚴(yán)格意義上,Netbios 是接入網(wǎng)絡(luò)服務(wù)的接口標(biāo)準(zhǔn)。
  Netbios 原來(lái)是作為THE網(wǎng)絡(luò)控制器為 IBM 局域網(wǎng)設(shè)計(jì)的,是通過特定硬件用來(lái)和網(wǎng)絡(luò)操作系統(tǒng) 連接的軟件層。Netbios經(jīng)擴(kuò)展,允許程序使用Netbios接口來(lái)操作IBM令牌環(huán)結(jié)構(gòu)。Netbios 已被公認(rèn)為工業(yè)標(biāo)準(zhǔn),通常參照 Netbios-compatible LANs。
  它提供給網(wǎng)絡(luò)程序一套方法,相互通訊及傳輸數(shù)據(jù)。基本上,Netbios 允許程序和網(wǎng)絡(luò)會(huì)話。它的目的是把程序和任何類型的硬件屬性分開。它也使軟件開發(fā)員可以免除以下負(fù)擔(dān):開發(fā)網(wǎng)絡(luò)錯(cuò)誤修復(fù),低層信息尋址和路由。使用Netbios接口,可以為軟件開發(fā)員做許多工作。
  Netbios使程序和局域網(wǎng)操作能力之間的接口標(biāo)準(zhǔn)化。有它們可以將程序細(xì)化到為OSI模型的哪一層所寫,使程序能移植到其他網(wǎng)絡(luò)上。在Netbios局域網(wǎng)環(huán)境下,計(jì)算機(jī)通過名字被系統(tǒng)知道。網(wǎng)絡(luò)中每臺(tái)計(jì)算機(jī)都有通過不同方法編的永久性名稱。這些名稱將在下面做進(jìn)一步討論。
  通過使用Netbios的數(shù)據(jù)報(bào)或廣播方式,在Netbios局域網(wǎng)上的pc機(jī)建立會(huì)話彼此聯(lián)絡(luò)。會(huì)話允許更多的信息被傳送,探測(cè)錯(cuò)誤,和糾正。通信是在一對(duì)一的基礎(chǔ)上的。數(shù)據(jù)報(bào)或廣播方式允許一臺(tái)計(jì)算機(jī)和多臺(tái)其他的計(jì)算機(jī)同時(shí)通信,但信息大小受限。使用數(shù)據(jù)報(bào)或廣播方式?jīng)]有探測(cè)錯(cuò)誤和糾正。然而,數(shù)據(jù)報(bào)通信可以不必建立一個(gè)會(huì)話。
  在這種環(huán)境下所有的通信以一種稱為“網(wǎng)絡(luò)控制塊“的格式提交給NetBIOS。內(nèi)存中這些塊的分配依賴于用戶程序。這些“網(wǎng)絡(luò)控制塊“分配到域中,分別為輸入/輸出保留。
  在當(dāng)今的環(huán)境中,NetBIOS是使用很普遍的協(xié)議。以太網(wǎng),令牌環(huán),IBM PC網(wǎng)都支持NetBIOS。在它原始版本中,它僅作為程序和網(wǎng)絡(luò)適配器的接口。從那以后,傳輸類功能加入NetBIOS,使它功能日益增多。
  在NetBIOS里,面向連接(tcp)和無(wú)連接(udp)通信均支持。它支持廣播和復(fù)播,支持三個(gè)分開的服務(wù):命名,會(huì)話,數(shù)據(jù)報(bào)。
四、使用SMB協(xié)議訪問局域網(wǎng)中的共享文件
1、使用jcifs的jar包:jcifs-1.3.14.jar,下載地址:http://jcifs.samba.org/
2、本機(jī)地址:10.130.14.37,局域網(wǎng)中的地址:10.130.14.111,其共享文件:share(設(shè)置讀取、修改、完全控制的權(quán)限)
3、java代碼
package my.test; import java.io.IOException; import jcifs.smb.SmbAuthException; import jcifs.smb.SmbException; import jcifs.smb.SmbFileInputStream; import jcifs.smb.SmbFile; import jcifs.smb.SmbFileOutputStream; public class ReadShareFile { /** * jcifs的開發(fā)方法類似java的文件操作功能,它的資源url定位:smb://{user}:{password}@{host}/{path}, * smb為協(xié)議名,user和password分別為共享文件機(jī)子的登陸名和密碼,@后面是要訪問的資源的主機(jī)名或IP地址。最后是資源的共享文件夾名稱和共享資源名。 * 例如smb://administrator:122122@192.168.0.22/test/response.txt。 * * 在JAVA程序中,使用如下方式獲得一個(gè)遠(yuǎn)程共享文件(設(shè)置共享文件的權(quán)限——讀取、修改、完全控制)的句柄:SmbFile file = newSmbFile("smb://guest:1234@192.168.3.56/share/a.txt"); * 這里的句柄不僅限于遠(yuǎn)程的共享文件,還可能是共享文件夾。 * isFile()方法和isDirectory()用來(lái)判斷這個(gè)句柄對(duì)應(yīng)的資源的真實(shí)屬性。如果是共享文件夾 * ,通過調(diào)用它的list()方法將獲得其中資源的列表。 * List方法支持過濾器機(jī)制,有兩種過濾器可供使用,一種是SmbFileFilter,另一種是SmbFilenameFilter * ,這兩個(gè)在jcifs中作為接口出現(xiàn),你可以根據(jù)自己的需要派生出個(gè)性化的過濾器,實(shí)現(xiàn)接口中的accept方法,以滿足不同業(yè)務(wù)的需求。 *    * SmbFileInputStream是smb文件的輸入流,它的功能是以流的方式打開一個(gè)SmbFile:SmbFileInputStream * in = new SmbFileInputStream(file);SmbFileInputStream提供read方法,你可以從這個(gè)流中讀出遠(yuǎn)程文件全部的內(nèi)容。 * * @param args * @throws IOException */ @SuppressWarnings("static-access") public static void main(String[] args) {try{ //局域網(wǎng)共享文件,讀文件SmbFile smbFile = new SmbFile("smb://administrator:dibindb@10.130.14.111/share/aa.txt");// 通過 smbFile.isDirectory();isFile()可以判斷smbFile是文件還是文件夾int length = smbFile.getContentLength();// 得到文件的大小byte buffer[] = new byte[length];SmbFileInputStream in = new SmbFileInputStream(smbFile); // 建立smb文件輸入流while ((in.read(buffer)) != -1){System.out.write(buffer);System.out.println("\n"+buffer.length);}in.close();smbFile.delete();//局域網(wǎng)共享文件,寫文件SmbFile smbFileOut = new SmbFile("smb://administrator:dibindb@10.130.14.101/share/bb.txt");if(!smbFileOut.exists())smbFileOut.createNewFile();SmbFileOutputStream out = new SmbFileOutputStream(smbFileOut);out.write("abcdefw".getBytes());out.close();smbFileOut.delete();}catch (SmbAuthException e){SmbException smb = new SmbException(1,false);System.out.println(e.getNtStatus()==smb.NT_STATUS_ACCESS_DENIED);for(int i=0;i<smb.NT_STATUS_CODES.length;i++){System.out.println(smb.NT_STATUS_CODES[i]);}e.printStackTrace();}catch (IOException e){e.printStackTrace();} } } 4、相關(guān)錯(cuò)誤 (1)share只有讀取權(quán)限 jcifs.smb.SmbAuthException: Access is denied. at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:528) at jcifs.smb.SmbTransport.send(SmbTransport.java:645) at jcifs.smb.SmbSession.send(SmbSession.java:244) at jcifs.smb.SmbTree.send(SmbTree.java:119) at jcifs.smb.SmbFile.send(SmbFile.java:770) at jcifs.smb.SmbFile.delete(SmbFile.java:2410) at jcifs.smb.SmbFile.delete(SmbFile.java:2354) at my.test.ReadShareFile.main(ReadShareFile.java:50)

如果通過路由器轉(zhuǎn)發(fā)需要在路由器上指定端口,139,445。

jcifs 無(wú)法訪問xp共享目錄問題 jcifs.smb.SmbAuthException
jcifs.smb.SmbAuthException: Logon failure: unknown user name or bad password. at jcifs.smb.SmbSession.sessionSetup(SmbSession.java:273) at jcifs.smb.SmbSession.send(SmbSession.java:225) at jcifs.smb.SmbTree.treeConnect(SmbTree.java:147) at jcifs.smb.SmbFile.connect(SmbFile.java:791) at jcifs.smb.SmbFile.connect0(SmbFile.java:761) at jcifs.smb.SmbFile.open0(SmbFile.java:816) at jcifs.smb.SmbFile.open(SmbFile.java:845) at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:69) at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:62) at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:49) at cn.com.egova.dti.dao.AdjunctManager.main(AdjunctManager.java:188)

解決辦法:工具-->文件夾選項(xiàng)-->查看-->使用簡(jiǎn)單文件共享,去掉勾選即可


通過域名獲得IP和判斷是否為IP地址
java.net.InetAddress[] x= java.net.InetAddress.getAllByName("www.aaa.com");String ip = "";if(x.length>0){ip = x[0].toString().split("/")[1];}/** * IP地址正則表達(dá)式 ((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)) */ String IPADDRESS = "((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))";Pattern pattern = Pattern.compile(IPADDRESS);Matcher matcher = pattern.matcher(x.toString());boolean isIp = matcher.matches();


創(chuàng)建文件夾
try {if (!smbTempFile.isDirectory())smbTempFile.mkdirs(); } catch (SmbException e) {// TODO Auto-generated catch blocke.printStackTrace(); }

總結(jié)

以上是生活随笔為你收集整理的基于SMB协议的共享文件读写 博客分类: Java的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。