2016-07-11 18 views
2

我想寫一個關於Bonjour服務和一個簡單的套接字I/O流的示例。如何在使用OutputStream編寫時檢查成功?

Sample

Git URL

我目前能做的是:

  1. 發佈服務,並對其進行掃描。
  2. 在兩個設備或模擬器之間創建一個I/O流套接字。

套接字連接後,我發現文本發送到服務有問題。

@IBAction func sendMessage(sender:AnyObject!){ 

     if (self.outputStream == nil){ 
      print("Connection not create yet ! =====> Return") 
      return 
     } 

     let s : String = (self.textfield?.text)! 

     print("\(self.outputStream) ==> Pass Data : \(s)") 

     let data: NSData = s.data(using: String.Encoding.utf8)! 

     self.outputStream?.open() 
     self.outputStream?.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length) 
     self.outputStream?.close() 
     //Service no any response or log 
    } 

當按鈕按下時,似乎什麼也沒有發生,我想知道它是否寫入。

UPDATE

有與該客戶端接收該信息的問題。運行循環是需要的。

func netService(_ sender: NetService, didAcceptConnectionWith inputStream: InputStream, outputStream: NSOutputStream) { 

      self.receiveTextView?.text = "Accept Connection Success" 

      print("netService : \(sender) didAcceptConnectionWith Input Stream : \(inputStream) , Output Stream : \(outputStream)") 
      inputStream.delegate = self 
      outputStream.delegate = self 
      inputStream.schedule(in: RunLoop.main(), forMode: RunLoopMode.defaultRunLoopMode) 
      outputStream.schedule(in: RunLoop.main(), forMode: RunLoopMode.defaultRunLoopMode) 
      inputStream.open() 
      outputStream.open() 
     } 

然後數據在Stream委託中被接收。

func stream(_ aStream: Stream, handle eventCode: Stream.Event) { 
    case Stream.Event.hasBytesAvailable: 

      NSLog("HasBytesAvailable") 

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

      let inputStream = aStream as? InputStream 

      while ((inputStream?.hasBytesAvailable) != false){ 
       let len = inputStream?.read(&buffer, maxLength: buffer.count) 
       if(len > 0){ 
        let output = NSString(bytes: &buffer, length: buffer.count, encoding: String.Encoding.utf8.rawValue) 
        if (output != ""){ 
         NSLog("Server Received : %@", output!) 
         self.receiveTextView?.text = output as String? 
        } 
       }else{ 
        break 
       } 
      } 
      break 
    default: 
      NSLog("unknown.") 
    } 

}

回答

2

假設你知道sendMessage(_:)方法獲取調用,所有你希望做的是檢查寫入是否成功,這可以在一個直接的方式所做查看寫入方法的返回值(documentation)下面是一個簡單示例。

@IBAction func sendMessage(sender: AnyObject!) { 
    guard let outputStream = outputStream else { 
     print("Connection not create yet ! =====> Return") 
     return 
    } 

    guard let text = textfield?.text, 
     data: NSData = text.data(using: String.Encoding.utf8) else { 
      print("no data") 
      return 
    } 

    print("\(outputStream) ==> Pass Data : \(text)") 
    outputStream.open() 
    defer { 
     outputStream.close() 
    } 

    let result = outputStream.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length) 
    if result == 0 { 
     print("Stream at capacity") 
    } else if result == -1 { 
     print("Operation failed: \(outputStream.streamError)") 
    } else { 
     print("The number of bytes written is \(result)") 
    } 
} 
+0

謝謝,我現在試試你的示例代碼,並在這裏回覆結果。 –

+0

我得到了這樣的日誌 看來問題是接收者不是發送者。 <__ NSCFOutputStream:0x1266c5dc0> ==>通過數據:測試 寫入的字節數是4 ,看起來成功了,但服務沒有發生。 –

+0

您的答案可以在第一個動作中發送成功,但第二個將始終失敗,我必須將代碼標記爲「outputStream.close()」,而不是每次都會成功,爲什麼? –