12.13 Zugriff auf SMB-Server
Microsoft Windows nutzt zur Datei- und Verzeichnisfreigabe, zur Freigabe von Druckern und Kommunikationsschnittstellen das Protokoll SMB (Server Message Block). Es ist sehr verbreitet und jedes neuere Windows-Version (ab Win95 und NT) lässt sich als Client und Server konfigurieren - gleichzeitig gibt es unter Unix das populäre Samba, ein SMB-Server unter Open-Source von Andrew Tridgell.
Die Geschichte des SMB-Protokolls geht zurück auf das Jahr 1985, als eine Gruppe von IBM über ein verteiltes Dateisystem nachdachte. Von 1987 tat sich Microsoft und Intel zusammen und dokumentierten ihre Vorstellung im Networks/OpenNET-FILE SHARING PROTOCOL. Das Protokoll hat sich in den Jahren seines Daseins immer wieder verändert (Core Protocol, LAN Manager). Die wichtigste SMB-Variante dürfte NT LM 0.12 sein. In jüngerer Zeit haben Microsoft und eine Gruppe weiterer Hersteller (DEC, Data General, SCO, Network Appliance Corp, ...) das Protokoll weiter entwickelt (embrace, extend) und nannten es 1996 CIFS. Samba implementiert den Dialekt NT LM 0.12.
12.13.1 jCIFS
Mit Hilfe der jCIFS-SMB-Bibliothek (http://jcifs.samba.org/) kann ein Java-Programm auf Datei- und Verzeichnisfreigaben zugreifen und Freigaben auflisten. jCIFS ist eine erweiterte Implementierung von CIFS und unterstützt Unicode, Batching, verschlüsselte Authentifizierung, Transactions, Remote Access Protocol (RAP) und Weiteres. Die Bibliothek steht unter der LGPL.
Die Klassen jcifs.smb.SmbFile, SmbFileInputStream und SmbFileOutputStream verhalten sich ähnlich wie java.io.File, FileInputStream und FileOutputStream. Sie werden mit einem Dateipfad (URL) parametrisiert, der mit smb:// beginnt. Um eine Datei zu beziehen, muss vorher der Server spezifiziert werden. Dazu dienen Eigenschaften wie WINS. Sie werden mit Config.setProperty("wins", "<IP-Adresse>"); gesetzt.
Ein Beispiel soll zeigen, wie eine Datei ausgelesen und umkopiert werden kann.
InputStream in =
new SmbFileInputStream( "smb://user:passwd@host/c/My Documents/doc.txt" );
byte b[] = new byte[8192];
for ( int n; ( n = in.read( b )) > 0; )
out.write( b, 0, n );
Neben den Lese-/Schreib-Operationen lässt sich wie bei java.io.File eine Liste der Inhalte geben, Verzeichnisse anlegen und so weiter.
|