Blogブログ

Androidでsmbからデータ見たい

ファイルサーバからデータを読み込みたいねん

過去の事例ですが、Androidからファイルサーバのデータを読み込みたいと話がありました。
ファイルサーバってことは、smbプロトコルですね。

ちなみに、smbってなんやねんの説明

Server Message Block (SMB) は、主にWindowsを中心とした環境でLANを通じてファイル共有やプリンタ共有などに使用される通信プロトコルの総称。OSI参照モデルでは第7層アプリケーション層に該当する。認証つきプロセス間通信機構としても動作する。
下位層のプロトコルとしてNetBEUIを使用していた時代には、サブネットを越えるルーティングはできず、中大規模のネットワークには向かないとされたが、NetBIOS over TCP/IP(英語版)や、NetBIOSも必要としないCIFS(Common Internet File System)により、大規模ネットワークでも使用可能となっている。
引用元:wikipedia

このプロトコルのおかげで、Windows機からLinuxで構築したファイルサーバのデータを参照したり、また逆も可能となっています。

LinuxサーバではSambaが有名ですよね。

ライブラリ探し

便利なライブラリがいっぱいありましてJCIFSというライブラリを見つけました

下記よりjarファイルをダウンロードしましょう

https://www.jcifs.org/src/

だいぶ長い事更新されてませんが、最新のバージョンは「jcifs-1.3.19.jar」ですね。

ライセンスはLGPLです
GNU Lesser General Public License – wikipedia

ちなみに、このライブラリはSMB1しか対応していないので要注意です。

実装する

先ほどDLしたjarファイルをapp/libsフォルダに突っ込みましょう

あとはささっとコーディング


public String getData(String _user, String _pass, String _server, String _path) {
 
        String user = _user;
        String pass = _pass;
        String server = _server;
        String path = _path;
        String smb = "smb://" + user + ":" + pass + "@" + server + "/" + path;
 
        String data = "";
 
        SmbFileInputStream sfis = null;
        try {
            sfis = new SmbFileInputStream(smb);
            BufferedReader br = new BufferedReader(new InputStreamReader(sfis));
 
            String str = br.readLine();
            while(str != null){
                System.out.println(str);
                data += str + System.getProperty("line.separator");
                str = br.readLine();
            }
 
        } catch (SmbException e) {
            e.printStackTrace();
            return e.getMessage();
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return e.getMessage();
        } catch (UnknownHostException e) {
            e.printStackTrace();
            return e.getMessage();
        } catch (IOException e) {
            e.printStackTrace();
            return e.getMessage();
        }
 
        return data;
    }

SmbFileInputStreamクラスのインスタンスを作ります
その際、SambaのURL(URI?)を与えてやります

smb:[ユーザ名]:[パスワード]@[サーバ]/[path]

という感じで指定します

はい簡単

牧長 心

執筆者

CEO

牧長 心