2016-07-11 29 views
2

私はBonjourサービスと単純なソケットI/Oストリームについてのサンプルを書こうとしています。OutputStreamで書き込むときの成功を確認する方法は?

Sample

Git URL

私は現在、何ができるか、である:

  1. は、サービスを公開し、それをスキャンします。
  2. 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デリゲートで受信されます。あなたはsendMessage(_:)メソッドが呼び出さなっていると、あなたが行うために探しているすべての書き込みが成功したかどうかを確認され、これはでまっすぐ進む方法で行うことができることを知っていると仮定すると、

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

writeメソッドの戻り値を調べる(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()"をマークする必要があります、それはいつも成功するでしょう、なぜ??? –

関連する問題