2016-11-24 11 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のストリームメソッドと互換性がありません。 あなたがこれに変更する必要があります。

FUNCストリームを

代わりの

FUNCストリーム(aStream:ストリーム、のhandleEvent(_ aStream:Stream.Event:ストリーム、EVENTCODEを扱います) eventCode:Stream.Event

+0

ありがとう、Hoa!このエラーは私には起こりませんでした。私はこのようなものをクリーンアップするのに慣れています。完全に今! – andeey

関連する問題