2
我想寫一個關於Bonjour服務和一個簡單的套接字I/O流的示例。如何在使用OutputStream編寫時檢查成功?
我目前能做的是:
- 發佈服務,並對其進行掃描。
- 在兩個設備或模擬器之間創建一個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.")
}
}
謝謝,我現在試試你的示例代碼,並在這裏回覆結果。 –
我得到了這樣的日誌 看來問題是接收者不是發送者。 <__ NSCFOutputStream:0x1266c5dc0> ==>通過數據:測試 寫入的字節數是4 ,看起來成功了,但服務沒有發生。 –
您的答案可以在第一個動作中發送成功,但第二個將始終失敗,我必須將代碼標記爲「outputStream.close()」,而不是每次都會成功,爲什麼? –