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)具體的功能需求,有一些特殊的場景會用到,例如:
一些手機上的壁紙軟件,有橫屏的壁紙,但是橫屏的壁紙一般在電腦上使用,如果用SMB技術就可以直接將圖片傳到電腦的文件夾內(nèi),不用下載在本地后再通過微信/QQ傳給電腦,方便很多。
再如我們有時候有一個很大的apk包,通過微信傳給電腦會改后綴名,QQ可能還有大文件限制,這時候也可以考慮使用SMB來解決,畢竟自己寫的傳輸代碼,逼格直接拉滿??。
再者想要直接將設備中操作的數(shù)據(jù)反應在電腦上查看,例如一個平板端的視力檢測工具,檢測后直接將數(shù)據(jù)反應在電腦上供工作人員使用。
如何使用
1.前提條件
- 手機和電腦連接到同一局域網(wǎng)
- 電腦需要設置用戶名和密碼
- 設置共享文件夾 (smb://username:password@ip/folder。(登錄鑒權))
- Mac設置:系統(tǒng)偏好設置-共享-文件共享-添加共享文件夾
- Windows設置:文件夾-共享-高級共享-權限-打開更改權限
- 電腦不能息屏
設置共享文件夾:
| Mac設置 | Windows設置 |
|---|---|
![]() Mac設置
|
![]() Windows設置
|
2.代碼配置
具體源碼見GitHub:BySMB

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。

