2016-11-24 120 views
1

我在Swift 3中使用StreamDelegate连接到Java套接字时遇到了问题。我目前正在重写一个大型Objective C项目,其中这段代码像魅力一样运行,但我似乎无法让它在Swift 3中工作。我遇到的问题是流功能从不运行。所以“流”!从不打印出来。 self.outputStream.open()之后的Stream.Status被称为1(开放)。代码运行时没有任何问题,并且“打开线程上的流:”被调用。Swift 3输入流和输出流连接但没有流

我试图连接到的套接字是一个Java套接字。

注:我已经体验到调试器打印出一条消息,说没有附加处理程序,但我不知道它是相关的。

我发现了一些类似的帖子,但没有在这个确切的问题。如果有人有任何想法,我会很高兴听到他们!感谢任何想要帮助的人。

import Foundation 

@objc class SocketConnector : NSObject, StreamDelegate { 
    var inputStream : InputStream! 
    var outputStream : OutputStream! 

    var lock : NSRecursiveLock 

    override init() { 
     lock = NSRecursiveLock.init() 
    } 

func connect (host : String, port : Int) -> Bool { 
    lock.lock() 
    var readStream : Unmanaged<CFReadStream>? 
    var writeStream : Unmanaged<CFWriteStream>? 

    CFStreamCreatePairWithSocketToHost(nil, host as CFString!, UInt32(port), &readStream, &writeStream) 

    inputStream = readStream!.takeRetainedValue() 
    outputStream = writeStream!.takeRetainedValue() 

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

    self.inputStream.schedule(in: RunLoop.current, forMode: .defaultRunLoopMode) 
    self.outputStream.schedule(in: RunLoop.current, forMode: .defaultRunLoopMode) 

    self.inputStream.open() 
    self.outputStream.open() 

    print("Opening streams on thread: %@", Thread.current) 

    lock.unlock() 

    return true 
} 

func stream (aStream : Stream, handleEvent eventCode : Stream.Event) { 
    print("Stream!") 
    switch eventCode { 
    case Stream.Event.hasBytesAvailable: 
     print("Stream has bytes:"); 
     break; 
    case Stream.Event.errorOccurred: 
     print("Stream error occurred: %@",aStream.streamError?.localizedDescription) 
    case Stream.Event.openCompleted: 
     print("Stream has bytes:") 
     break 
    case Stream.Event.endEncountered: 
     print("Stream ended") 
     self.closeStreams() 
     break 
    default: 
     break 
    } 
} 

回答

2

您的工具与StreamDelegate的stream方法不兼容。 您必须改成这样:

FUNC流(_ aStream:流,处理EVENTCODE:Stream.Event)

,而不是

FUNC流(aStream:流,为handleEvent eventCode:Stream.Event

+0

谢谢,你好!这个错误从来没有发生过,我习惯于编译器清理这样的事情。现在完美! – andeey