Swift - 做一个简单的无线U盘(手机端Http服务器搭建)
生活随笔
收集整理的這篇文章主要介紹了
Swift - 做一个简单的无线U盘(手机端Http服务器搭建)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
由于iOS系統的封閉性,在數據傳輸方面十分不方便。不像安卓設備,直接連接電腦就能當U盤使用。所以一般我們如果用iPhone臨時存取個東西,要么使用數據線連接iTunes,要么手機電腦都登上QQ,使用QQ來傳輸。
但這兩種方式都略顯不便,所以市面上出現了無線U盤這類的APP。原理很簡單,就是軟件打開后會啟動HTTP服務器,這時電腦端使用瀏覽器輸入 手機的ip,就可以通過web頁面的形式訪問到這個軟件的用戶文檔。同時在這個web頁面里,直接可以進行文件的上傳,下載,刪除等操作。?
下面演示如何開發一個無線U盤,實現功能如下: 1,程序啟動后會啟動Web服務,并監聽設置的端口,等待請求 2,電腦瀏覽器輸入手機ip+端口,在web頁上會列出用戶文檔里所有文件 3,點擊文件,即可下載
效果圖如下:
詳細步驟: 1,這里用到了Swift Taylor(一個用Swift編寫HTTP服務器的開發包)。先把Taylor整個包引入到項目。
2,添加個頭文件bridge.h,并添加到編譯參數里(Taylor內部又使用了一個叫CocoaAsyncSocket的socket庫,使用Objective-C寫的)
3,頁面代碼?ViewController.swift
調試說明: 1,默認使用4000端口,可以在代碼里修改
2,真機調試的話,可以先把測試文件用iTunes傳到這個APP的用戶文檔里。再啟動程序,電腦輸入手機ip+端口訪問 3,模擬器調試的話,文件可以直接拷到這個程序的用戶文檔里(路徑在控制臺中有打印)。電腦輸入localhost+端口訪問 4,目前這個只能說是一個只讀U盤,有興趣的可以自行加上文件上傳和刪除功能。
源碼下載:WirelessStorage.zip
但這兩種方式都略顯不便,所以市面上出現了無線U盤這類的APP。原理很簡單,就是軟件打開后會啟動HTTP服務器,這時電腦端使用瀏覽器輸入 手機的ip,就可以通過web頁面的形式訪問到這個軟件的用戶文檔。同時在這個web頁面里,直接可以進行文件的上傳,下載,刪除等操作。?
下面演示如何開發一個無線U盤,實現功能如下: 1,程序啟動后會啟動Web服務,并監聽設置的端口,等待請求 2,電腦瀏覽器輸入手機ip+端口,在web頁上會列出用戶文檔里所有文件 3,點擊文件,即可下載
效果圖如下:
詳細步驟: 1,這里用到了Swift Taylor(一個用Swift編寫HTTP服務器的開發包)。先把Taylor整個包引入到項目。
2,添加個頭文件bridge.h,并添加到編譯參數里(Taylor內部又使用了一個叫CocoaAsyncSocket的socket庫,使用Objective-C寫的)
| 1 | #import "GCDAsyncSocket.h" |
3,頁面代碼?ViewController.swift
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | import UIKit import AssetsLibrary class ViewController: UIViewController { ????//文件操作類 ????var manager:NSFileManager! ????//保存用戶文檔目錄 ????var docPath:NSURL! ????? ????override func viewDidLoad() { ????????super.viewDidLoad() ????????// Do any additional setup after loading the view, typically from a nib. ????????? ????????//設置用戶文檔路徑 ????????manager = NSFileManager.defaultManager() ????????let urlsForDocDirectory = manager.URLsForDirectory( ????????????NSSearchPathDirectory.DocumentDirectory, ????????????inDomains:NSSearchPathDomainMask.UserDomainMask) ????????docPath = urlsForDocDirectory[0] as! NSURL ????????? ????????//設置Web服務器 ????????let server = Server() ????????dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { ????????????() -> Void in ????????????? ????????????server.addPostRequestHandler(Middleware.requestLogger(println)) ????????????? ????????????//首頁請求 ????????????server.get("/") { ????????????????request, response, callback in ????????????????? ????????????????self.createIndexHtml() ????????????????let file = self.docPath.URLByAppendingPathComponent("index.html") ????????????????let data = self.manager.contentsAtPath(file.path!) ????????????????response.body = data ????????????????callback(.Send(request, response)) ????????????} ????????????? ????????????//文件請求 ????????????server.get("/file") { ????????????????request, response, callback in ????????????????? ????????????????println(request.arguments) ????????????????var fileName = request.arguments["fileName"] ????????????????let file = self.docPath.URLByAppendingPathComponent(fileName!) ????????????????let data = self.manager.contentsAtPath(file.path!) ????????????????response.body = data ????????????????callback(.Send(request, response)) ????????????} ????????????? ????????????//啟動并監聽服務器 ????????????server.startListening(port: 4000, forever: true) { ????????????????result in ????????????????switch result { ????????????????case .Success: ????????????????????println("Up and running") ????????????????case .Error(let e): ????????????????????println("Server start failed \(e)") ????????????????} ????????????} ????????})??????? ????} ????? ????//加載用戶文檔下的文件,并生成index.html首頁 ????func createIndexHtml()->Void{ ????????var content = "<html><meta charset=\"utf-8\"><body>" ????????let contentsOfPath = manager.contentsOfDirectoryAtPath(docPath.path!, error: nil) ????????for child in contentsOfPath!{ ????????????content = content + "<a target='_blank' href='/file?fileName=\(child)'>\(child)</a><br/>" ????????} ????????content = content + "</body></html>" ????????createFile("index.html", fileBaseUrl: docPath, content:content) ????} ????? ????//創建文件 ????func createFile(name:String,fileBaseUrl:NSURL,content:String){ ????????var error:NSErrorPointer = nil ????????let file = fileBaseUrl.URLByAppendingPathComponent(name) ????????println("文件: \(file)") ????????let exist = manager.fileExistsAtPath(file.path!) ????????if !exist { ????????????var error:NSErrorPointer = nil ????????????manager.removeItemAtPath(file.path!, error:error) ????????} ????????? ????????let data = content.dataUsingEncoding(NSUTF8StringEncoding, ????????????allowLossyConversion: true) ????????let createSuccess = manager.createFileAtPath(file.path!,contents:data, ????????????attributes:nil) ????????println("文件創建結果: \(createSuccess)") ????} ????? ????override func didReceiveMemoryWarning() { ????????super.didReceiveMemoryWarning() ????????// Dispose of any resources that can be recreated. ????} } |
調試說明: 1,默認使用4000端口,可以在代碼里修改
2,真機調試的話,可以先把測試文件用iTunes傳到這個APP的用戶文檔里。再啟動程序,電腦輸入手機ip+端口訪問 3,模擬器調試的話,文件可以直接拷到這個程序的用戶文檔里(路徑在控制臺中有打印)。電腦輸入localhost+端口訪問 4,目前這個只能說是一個只讀U盤,有興趣的可以自行加上文件上傳和刪除功能。
源碼下載:WirelessStorage.zip
總結
以上是生活随笔為你收集整理的Swift - 做一个简单的无线U盘(手机端Http服务器搭建)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Centos7下安装Docker1.8
- 下一篇: 第 十 七 天 : 安 装 php 遇