2016-12-20 60 views
0

我想在輸入流文件從插座迅速獲取文件

有許多例子,以獲得從插座一個字符串,但沒有發現任何方法來獲得一個套接字文件

// To connect to the server 
func connect(host: String, port: Int) { 

    SwifterHandler.sharedInstance.FilePathSave = SwifterHandler.sharedInstance.rootDoc() 

    self.host = host 
    self.port = port 


    Stream.getStreamsToHost(withName: host, port: port, inputStream: &self.inputStream, outputStream: &self.outputStream) 


    if self.inputStream != nil && self.outputStream != nil { 
     self.inputStream!.delegate = self 
     self.outputStream!.delegate = self 
     self.inputStream!.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 
     self.outputStream!.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 


     self.inputStream!.open() 
     self.outputStream!.open() 
    } 

} 


// This is a call back func that takes care of I/O from/to the server. 
// Read about this func. There are many event codes to handle. 
// I just wanted to make it simple. 
func stream(aStream: Stream, handleEvent eventCode: Stream.Event) { 
    print("Event : \(eventCode)") 
    if aStream != inputStream { 
     return 
    } 

    if eventCode == .hasBytesAvailable { 
     self.ReadFile() 
    } 
} 

private func ReadFile() 
{ 
    var buffer = [UInt8](repeating: 0, count: 1024) 
    if let fh = FileHandle(forWritingAtPath: "\(SwifterHandler.sharedInstance.FilePathSave)/test.png") { 
     fh.seekToEndOfFile() 
    while (self.inputStream!.hasBytesAvailable){ 

     let bytesRead: Int = inputStream!.read(&buffer, maxLength: buffer.count) 

     if bytesRead >= 0 { 



      fh.write(Data(bytes: buffer)) 

     } 
    } 



     fh.closeFile() 
    } 
    SwifterHandler.sharedInstance.SharedFile(path: SwifterHandler.sharedInstance.FilePathSave) 
    self.dataReadCallback!("Success Download") 
    InstallApp().InstallApplication() 
    self.dataReadCallback!("Application Installed") 

} 

ReadFile的()不運行時服務器發送文件

回答

1
class ViewController: UIViewController,StreamDelegate 
{ 
    var inputstream: InputStream? 
    var outputstream: OutputStream? 
    var host: String? 
    var port: Int? 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     let _ = initNetworkCommunication()  
     let word = "Hello are you there->" 

     let buf = [UInt8](word.utf8) 
     print("This is buf = \(buf))") 


     outputstream?.write(buf, maxLength: buf.count) 
    } 

    func initNetworkCommunication() 
    { 
     host = "127.0.0.1"  //this is IP number passing as string 
     port = 34    //this is port number 


     Stream.getStreamsToHost(withName: host!, port: port!,inputStream: &inputstream, outputStream: &outputstream) 

     //here we are going to calling a delegate function 
     inputstream?.delegate = self as? StreamDelegate 
     outputstream?.delegate = self as? StreamDelegate 


     inputstream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 
     outputstream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 

     inputstream?.open() 
     print("Here the input stream will open") 

     outputstream?.open() 
     print("connected") 
    } 

    func stream(_ aStream: Stream, handle eventCode: Stream.Event) 
    { 
     print("we are in delegate method") 

     print("EventCode = \(eventCode)") 
     switch (eventCode) 
     { 
     case Stream.Event.openCompleted: 
      if(aStream == outputstream) 
      { 
       print("output:OutPutStream opened") 
      } 
      print("Input = openCompleted") 
      break 

     case Stream.Event.errorOccurred: 
      if(aStream === outputstream) 
      { 
       print("output:Error Occurred\n") 

      } 
      print("Input : Error Occurred\n") 
      break 

     case Stream.Event.endEncountered: 
      if(aStream === outputstream) 
      { 
       print("output:endEncountered\n") 
      } 
      print("Input = endEncountered\n") 
      break 

     case Stream.Event.hasSpaceAvailable: 
      if(aStream === outputstream) 
      { 
       print("output:hasSpaceAvailable\n") 
      } 

      print("Input = hasSpaceAvailable\n") 
      break 

     case Stream.Event.hasBytesAvailable: 
      if(aStream === outputstream) 
      { 
       print("output:hasBytesAvailable\n") 
      } 
      if aStream === inputstream 
      { 
       print("Input:hasBytesAvailable\n") 

       var buffer = [UInt8](repeating: 0, count: 4096) 

       //print("input buffer = \(buffer)") 
       // sleep(40) 

       while (self.inputstream!.hasBytesAvailable) 
       { 
        let len = inputstream!.read(&buffer, maxLength: buffer.count) 

        // If read bytes are less than 0 -> error 
        if len < 0 
        { 
         let error = self.inputstream!.streamError 
         print("Input stream has less than 0 bytes\(error!)") 
         //closeNetworkCommunication() 
        } 
        // If read bytes equal 0 -> close connection 
        else if len == 0 
        { 
         print("Input stream has 0 bytes") 
         // closeNetworkCommunication() 
        } 


        if(len > 0) 
         //here it will check it out for the data sending from the server if it is greater than 0 means if there is a data means it will write 
        { 
         let messageFromServer = NSString(bytes: &buffer, length: buffer.count, encoding: String.Encoding.utf8.rawValue) 

         if messageFromServer == nil 
         { 
          print("Network hasbeen closed") 
          // v1.closeNetworkCommunication() 
         } 
         else 
         { 
          print("MessageFromServer = \(String(describing: messageFromServer))") 
         } 
        } 
       } 
      } 

      break 

     default: 
      print("default block") 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 
+0

不要忘了進口的UIKit – kiran