下面演示如何开发一个无线U盘,实现功能如下:



1,程序启动后会启动Web服务,并监听设置的端口,等待请求



2,电脑浏览器输入手机ip+端口,在web页上会列出用户文档里所有文件



3,点击文件,即可下载





效果图如下:




android 模拟器 读取usb摄像头 安卓模拟器读取u盘_移动开发




详细步骤:


1,这里用到了 Swift Taylor(一个用Swift编写HTTP服务器的开发包)。先把Taylor整个包引入到项目。


android 模拟器 读取usb摄像头 安卓模拟器读取u盘_Server_02




2,添加个头文件bridge.h,并添加到编译参数里(Taylor内部又使用了一个叫CocoaAsyncSocket的socket库,使用Objective-C写的)

#           import           "GCDAsyncSocket.h"



3,页面代码 ViewController.swift

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盘,有兴趣的可以自行加上文件上传和删除功能。