我尝试在Swift中使用NSOutputStream和NSInputStream发送和接收数据。数据的发送运行良好,但我对接收有一些疑问。
我找到了一个处理NSStreamEvent的解决方案,我已经尝试过了。
首先,我的初始化连接的函数:
func initNetworkCommunication(){
var host : CFString = "127.0.0.1"
var port : UInt32 = 7001
var readstream : Unmanaged<CFReadStream>?
var writestream : Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &readstream, &writestream)
inputstream = readstream!.takeRetainedValue()
outputstream = writestream!.takeRetainedValue()
inputstream.delegate = self
outputstream.delegate = self
inputstream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
outputstream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
inputstream.open()
outputstream.open()
}
这部分起作用了。我已经将委托设置为self,所以我应该能够处理这个类中的NSStreamEvents。
func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
switch (eventCode){
case NSStreamEvent.OpenCompleted:
NSLog("Stream opened")
break
case NSStreamEvent.HasBytesAvailable:
NSLog("HasBytesAvailable")
break
case NSStreamEvent.ErrorOccurred:
NSLog("ErrorOccurred")
break
case NSStreamEvent.EndEncountered:
NSLog("EndEncountered")
break
default:
NSLog("unknown.")
}
}
在我的理解中,每次当一些数据到达时,它应该打印"HasBytesAvaible",但它打印的是“unknown”。每次都是这样。因此,我尝试了一下,结果如下所示:
func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
var buffer = [UInt8](count: 4096, repeatedValue: 0)
while (inputstream.hasBytesAvailable){
let result: Int = inputstream.read(&buffer, maxLength: buffer.count)
}
switch (eventCode){
case NSStreamEvent.OpenCompleted:
NSLog("Stream opened")
break
case NSStreamEvent.HasBytesAvailable:
NSLog("HasBytesAvailable")
var output = NSString(bytes: &buffer, length: buffer.count, encoding: NSUTF8StringEncoding)
NSLog("output: %@", output)
receiveMessage(output) //only adds the message to an array
break
case NSStreamEvent.ErrorOccurred:
NSLog("ErrorOccurred")
break
case NSStreamEvent.EndEncountered:
NSLog("EndEncountered")
break
default:
NSLog("unknown.")
}
}
它是这样工作的,但我想问你这是不是正确的方式?此时的最佳实践是什么?
更新几周前我又做了一次,找出了我的错误。因此,这是有效的代码。
func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
switch (eventCode){
case NSStreamEvent.ErrorOccurred:
NSLog("ErrorOccurred")
break
case NSStreamEvent.EndEncountered:
NSLog("EndEncountered")
break
case NSStreamEvent.None:
NSLog("None")
break
case NSStreamEvent.HasBytesAvailable:
NSLog("HasBytesAvaible")
var buffer = [UInt8](count: 4096, repeatedValue: 0)
if ( aStream == inputstream){
while (inputstream.hasBytesAvailable){
var len = inputstream.read(&buffer, maxLength: buffer.count)
if(len > 0){
var output = NSString(bytes: &buffer, length: buffer.count, encoding: NSUTF8StringEncoding)
if (output != ""){
NSLog("server said: %@", output!)
}
}
}
}
break
case NSStreamEvent.allZeros:
NSLog("allZeros")
break
case NSStreamEvent.OpenCompleted:
NSLog("OpenCompleted")
break
case NSStreamEvent.HasSpaceAvailable:
NSLog("HasSpaceAvailable")
break
}
发布于 2015-01-29 20:23:13
你错过了事件hasSpaceAvailable
,当它显示“未知”时,我希望它会发生。它告诉您,它已准备好接收更多数据。
通常,我避免在枚举的switch语句中使用default
,因为编译器会在遗漏某些东西时告诉您。
发布于 2015-12-08 14:02:14
我正在使用hoedding写的代码,并注意到一个错误。这行代码:
var output = NSString(bytes: &buffer, length: buffer.count, encoding: NSUTF8StringEncoding)
应替换为:
var output = NSString(bytes: &buffer, length: len, encoding: NSUTF8StringEncoding)
您必须在output
变量中只获取服务器返回的字符数,而不是缓冲区的完整长度,否则您将从以前的请求中获得垃圾。
https://stackoverflow.com/questions/26360962
复制相似问题