首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSInputStream / NSOutputStream未打开

NSInputStream / NSOutputStream未打开
EN

Stack Overflow用户
提问于 2015-08-24 20:38:40
回答 1查看 2K关注 0票数 3

我正在尝试用NSInputStreamNSOutputStream建立到TCP服务器的连接。从未收到HasBytesAvailableHasSpaceAvailable-event。所以我不知道插座是否真的安装好了?

在这个特定的情况下,我可以访问服务器,并且可以实际看到它建立了一个连接,所以我尝试在HasSpaceAvailable-event被接收并工作之前编写数据!

但是,由于HasBytesAvailable-event从不触发,所以我不知道何时从流中读取。

我已经读过大部分类似的文章,我试过很多,但是没有运气。

如果有人能看到我错过的明显的东西,那将对我有很大帮助!:)

下面是我们班的相关代码:

代码语言:javascript
复制
class TCPConnection : NSObject, NSStreamDelegate {


    private var host: String
    private var port: Int
    private var inputStream: NSInputStream?
    private var outputStream: NSOutputStream?
    private var readyToWrite = true

    init(host: String, port: Int) {
        self.host = host
        self.port = port

        super.init()

        NSStream.getStreamsToHostWithName(self.host, port: self.port, inputStream: &inputStream, outputStream: &outputStream)

        inputStream!.delegate = self
        outputStream!.delegate = self

        inputStream!.scheduleInRunLoop(.currentRunLoop(), forMode: NSDefaultRunLoopMode)
        outputStream!.scheduleInRunLoop(.currentRunLoop(), forMode: NSDefaultRunLoopMode)

        inputStream!.open()
        outputStream!.open()
    }

    func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
        if (aStream == inputStream) {
            print("event received: inputStream")
            switch eventCode {
            case NSStreamEvent.ErrorOccurred:
                print("ErrorOccurred: \(aStream.streamError?.description)")
                break

            case NSStreamEvent.EndEncountered:
                print("EndEncountered: \(aStream.streamError?.description)")
                break

            case NSStreamEvent.HasBytesAvailable:
                print("HasBytesAvailable")
                break

            case NSStreamEvent.None:
                print("None")
                break

            case NSStreamEvent.OpenCompleted:
                print("opened!")
                break

            default:
                print("default")
            }
        } else if aStream == outputStream {
            print("event received: outputStream")
            switch eventCode {
            case NSStreamEvent.ErrorOccurred:
                print("ErrorOccurred: \(aStream.streamError?.description)")
                break

            case NSStreamEvent.EndEncountered:
                print("EndEncountered: \(aStream.streamError?.description)")
                break

            case NSStreamEvent.HasSpaceAvailable:
                print("HasSpaceAvailable")
                break

            case NSStreamEvent.None:
                print("None")
                break

            case NSStreamEvent.OpenCompleted:
                print("opened!")
                break

            default:
                print("default")
            }
        } else {
            print("another stream?")
        }

    }        

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-01 11:01:14

只需在getStreamsToHostWithName方法调用中添加自动释放池,因为在块执行完成时NSStream已解除分配

代码语言:javascript
复制
autoreleasepool {
        NSStream.getStreamsToHostWithName(self.host, port: self.port, inputStream: &inputStream, outputStream: &outputStream)
}

我已经在xcode7 beta 4和SocketTest工具(redirect)中测试了上述代码。

另外,您也可以使用CFStreamCreatePairWithSocketToHost API。

代码语言:javascript
复制
class TCPConnection: NSObject, NSStreamDelegate {
    var host:String?
    var port:UInt32?
    var inputStream: NSInputStream?
    var outputStream: NSOutputStream?
    var status = false;
    var output = "message"
    var bufferSize = 1024;
init(host: String, port:UInt32){
    self.host = host
    self.port = port
    self.status = false
    output = ""
    super.init()
}

func stream(aStream: NSStream, handleEvent aStreamEvent: NSStreamEvent) {
    switch aStreamEvent {

    case NSStreamEvent.OpenCompleted:
        print("OpenCompleted")
        break

    case NSStreamEvent.HasBytesAvailable:
        print("HasBytesAvailable")
        break

    case NSStreamEvent.HasSpaceAvailable:
        print("HasSpaceAvailable")
        break

    case NSStreamEvent.EndEncountered:
        print("EndEncountered")

        //            aStream.close()
        aStream.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
        break

    case NSStreamEvent.None:

        break

    case NSStreamEvent.ErrorOccurred:

        break

    default:
        print("# something weird happend")
        break
    }
}

func connect() {
    print("# connecting to \(host):\(port)")
    var cfReadStream : Unmanaged<CFReadStream>?
    var cfWriteStream : Unmanaged<CFWriteStream>?

    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port!, &cfReadStream, &cfWriteStream)
    inputStream = cfReadStream!.takeRetainedValue()
    outputStream = cfWriteStream!.takeRetainedValue()

    inputStream!.delegate = self
    outputStream!.delegate = self

    inputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
    outputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)

    inputStream!.open()
    outputStream!.open()
}


func read(){
    var buffer = [UInt8](count: bufferSize, repeatedValue: 0)
    output = ""
    while (self.inputStream!.hasBytesAvailable){
        var bytesRead: Int = inputStream!.read(&buffer, maxLength: buffer.count)
        if bytesRead >= 0 {
            output += NSString(bytes: UnsafePointer(buffer), length: bytesRead, encoding: NSASCIIStringEncoding)! as String
        } else {
            print("# error")
        }
        print("> \(output)")
    }
}

func send(message:String){
    let data:NSData = message.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
    let bytesWritten = self.outputStream!.write(UnsafePointer(data.bytes), maxLength: data.length)
    print("< send to \(host)")

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

https://stackoverflow.com/questions/32191344

复制
相关文章

相似问题

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