Android SMB 簡單幾步實現(xiàn)手機給電腦傳輸數(shù)據(jù)

SMB是什么

SMB,即"Server Message Block" 服務器信息塊,是一個網(wǎng)絡文件共享協(xié)議,它能被用于Web連接和客戶端與服務器之間的信息溝通,允許應用程序和終端用戶從遠端的文件服務器訪問文件資源。

SMB通信協(xié)議是微軟(Microsoft)和英特爾(Intel)在1987年制定的協(xié)議,主要是作為Microsoft網(wǎng)絡的通訊協(xié)議。SMB 是在會話層(session layer)和表示層(presentation layer)以及小部分應用層(application layer)的協(xié)議。

通過它可以簡單的給電腦傳輸文件,不過SMB不太安全:
SMB協(xié)議中采用控制文件安全傳輸?shù)臋C制是使用客戶身份驗證的方式,該方式通過客戶端向服務器端發(fā)送驗證密碼來獲取文件傳輸?shù)臋嘞?,不過針對該機制的網(wǎng)絡攻擊相對嚴重,攻擊程序通過對驗證密碼的截獲來竊取文件的訪問權限,局域網(wǎng)下文件傳輸?shù)陌踩缘貌坏奖U稀?/code>

使用場景

一般不會采用這種方式來實現(xiàn)具體的功能需求,有一些特殊的場景會用到,例如:

  1. 一些手機上的壁紙軟件,有橫屏的壁紙,但是橫屏的壁紙一般在電腦上使用,如果用SMB技術就可以直接將圖片傳到電腦的文件夾內(nèi),不用下載在本地后再通過微信/QQ傳給電腦,方便很多。

  2. 再如我們有時候有一個很大的apk包,通過微信傳給電腦會改后綴名,QQ可能還有大文件限制,這時候也可以考慮使用SMB來解決,畢竟自己寫的傳輸代碼,逼格直接拉滿??。

  3. 再者想要直接將設備中操作的數(shù)據(jù)反應在電腦上查看,例如一個平板端的視力檢測工具,檢測后直接將數(shù)據(jù)反應在電腦上供工作人員使用。

如何使用

1.前提條件

  • 手機和電腦連接到同一局域網(wǎng)
  • 電腦需要設置用戶名和密碼
  • 設置共享文件夾 (smb://username:password@ip/folder。(登錄鑒權))
    • Mac設置:系統(tǒng)偏好設置-共享-文件共享-添加共享文件夾
    • Windows設置:文件夾-共享-高級共享-權限-打開更改權限
  • 電腦不能息屏

設置共享文件夾:

Mac設置 Windows設置
Mac設置
Windows設置

2.代碼配置

具體源碼見GitHub:BySMB

Demo使用

1).代碼引入

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

dependencies {
    implementation 'com.github.youlookwhat:BySMB:1.1.0'
}

2).開啟聯(lián)網(wǎng)權限

<uses-permission android:name="android.permission.INTERNET" />

3).在Application初始化

BySMB.initProperty()

4).得到SMB實例

val bySmb = BySMB.with()
        .setConfig(
                et_ip.text.toString(),       // ip
                et_username.text.toString(),// 用戶名
                et_password.text.toString(),// 密碼
                et_foldName.text.toString()// 共享文件夾名
        )
        .setReadTimeOut(60)
        .setSoTimeOut(180)
        .build()

查看ip:

  • Mac上查看ip:ifconfig | grep "inet"
  • Windows上查看ip:ipconfig

3.上傳文件到電腦

fun upload(bySmb: BySMB) {
    // 生成文件 File
    val writeStringToFile = writeStringToFile(
            instance,
            et_content.text.toString(), // 文本內(nèi)容
            et_fileName.text.toString()// 文件名,例如:隨感筆記.txt
    )
    // 上傳
    bySmb.writeToFile(writeStringToFile, object : OnOperationFileCallback {

        override fun onSuccess() {
            // 成功
        }

        override fun onFailure(message: String) {
            // 失敗
        }

    })
}

注意:如上傳相同文件名的文件,會覆蓋之前文件的內(nèi)容。

4.查找電腦上的文件列表

fun listFile(bySmb: BySMB){
    // 讀取根目錄下的所有文件,重載方法("", "*.txt", callback)
    bySmb.listShareFileName(object : OnReadFileListNameCallback {
        override fun onSuccess(fileNameList: List<String>) {
            // 讀取成功 fileNameList文件名列表
        }

        override fun onFailure(message: String) {
             // 失敗
        }
    })
}

5.刪除電腦上的文件

fun deleteFile(bySmb: BySMB){
    bySmb.deleteFile(et_fileName.text.toString(), object : OnOperationFileCallback {
        override fun onSuccess() {
        // 刪除成功
        }

        override fun onFailure(message: String) {
            // 失敗
        }
    })
}

結語

SMB一般用不到,但是也有部分有需求的用戶,之前做的時候遇到很多摸不著頭腦的地方,而且很多的資料是外文的,希望此篇文章對部分人有所幫助。附上源碼地址,GitHub:BySMB。

相關資料

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容