首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Swift中接收来自NSInputStream的数据

在Swift中接收来自NSInputStream的数据
EN

Stack Overflow用户
提问于 2014-10-14 20:36:10
回答 2查看 16.4K关注 0票数 18

我尝试在Swift中使用NSOutputStream和NSInputStream发送和接收数据。数据的发送运行良好,但我对接收有一些疑问。

我找到了一个处理NSStreamEvent的解决方案,我已经尝试过了。

首先,我的初始化连接的函数:

代码语言:javascript
复制
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。

代码语言:javascript
复制
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”。每次都是这样。因此,我尝试了一下,结果如下所示:

代码语言:javascript
复制
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.")
    }
}

它是这样工作的,但我想问你这是不是正确的方式?此时的最佳实践是什么?

更新几周前我又做了一次,找出了我的错误。因此,这是有效的代码。

代码语言:javascript
复制
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
  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-29 20:23:13

你错过了事件hasSpaceAvailable,当它显示“未知”时,我希望它会发生。它告诉您,它已准备好接收更多数据。

通常,我避免在枚举的switch语句中使用default,因为编译器会在遗漏某些东西时告诉您。

票数 3
EN

Stack Overflow用户

发布于 2015-12-08 14:02:14

我正在使用hoedding写的代码,并注意到一个错误。这行代码:

代码语言:javascript
复制
var output = NSString(bytes: &buffer, length: buffer.count, encoding: NSUTF8StringEncoding)

应替换为:

代码语言:javascript
复制
var output = NSString(bytes: &buffer, length: len, encoding: NSUTF8StringEncoding)

您必须在output变量中只获取服务器返回的字符数,而不是缓冲区的完整长度,否则您将从以前的请求中获得垃圾。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26360962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档