SMB是什么
SMB万哪,即"Server Message Block" 服務(wù)器信息塊赃春,是一個網(wǎng)絡(luò)文件共享協(xié)議,它能被用于Web連接和客戶端與服務(wù)器之間的信息溝通籍凝,允許應(yīng)用程序和終端用戶從遠端的文件服務(wù)器訪問文件資源路媚。
SMB通信協(xié)議是微軟(Microsoft)和英特爾(Intel)在1987年制定的協(xié)議黄琼,主要是作為Microsoft網(wǎng)絡(luò)的通訊協(xié)議。SMB 是在會話層(session layer)和表示層(presentation layer)以及小部分應(yīng)用層(application layer)的協(xié)議整慎。
通過它可以簡單的給電腦傳輸文件脏款,不過SMB不太安全:
SMB協(xié)議中采用控制文件安全傳輸?shù)臋C制是使用客戶身份驗證的方式,該方式通過客戶端向服務(wù)器端發(fā)送驗證密碼來獲取文件傳輸?shù)臋?quán)限裤园,不過針對該機制的網(wǎng)絡(luò)攻擊相對嚴重撤师,攻擊程序通過對驗證密碼的截獲來竊取文件的訪問權(quán)限,局域網(wǎng)下文件傳輸?shù)陌踩缘貌坏奖U稀?/code>
使用場景
一般不會采用這種方式來實現(xiàn)具體的功能需求拧揽,有一些特殊的場景會用到剃盾,例如:
一些手機上的壁紙軟件,有橫屏的壁紙淤袜,但是橫屏的壁紙一般在電腦上使用痒谴,如果用SMB技術(shù)就可以直接將圖片傳到電腦的文件夾內(nèi),不用下載在本地后再通過微信/QQ傳給電腦铡羡,方便很多积蔚。
再如我們有時候有一個很大的apk包,通過微信傳給電腦會改后綴名蓖墅,QQ可能還有大文件限制库倘,這時候也可以考慮使用SMB來解決临扮,畢竟自己寫的傳輸代碼论矾,逼格直接拉滿??。
再者想要直接將設(shè)備中操作的數(shù)據(jù)反應(yīng)在電腦上查看杆勇,例如一個平板端的視力檢測工具贪壳,檢測后直接將數(shù)據(jù)反應(yīng)在電腦上供工作人員使用。
如何使用
1.前提條件
- 手機和電腦連接到同一局域網(wǎng)
- 電腦需要設(shè)置用戶名和密碼
- 設(shè)置共享文件夾 (smb://username:password@ip/folder蚜退。(登錄鑒權(quán)))
- Mac設(shè)置:系統(tǒng)偏好設(shè)置-共享-文件共享-添加共享文件夾
- Windows設(shè)置:文件夾-共享-高級共享-權(quán)限-打開更改權(quán)限
- 電腦不能息屏
設(shè)置共享文件夾:
Mac設(shè)置 | Windows設(shè)置 |
---|---|
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)權(quán)限
<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) {
// 失敗
}
})
}
結(jié)語
SMB一般用不到配猫,但是也有部分有需求的用戶,之前做的時候遇到很多摸不著頭腦的地方杏死,而且很多的資料是外文的泵肄,希望此篇文章對部分人有所幫助。附上源碼地址淑翼,GitHub:BySMB腐巢。