2016-12-14 5 views
5

私はSwiftのソケットで遊んでいて、サーバーとアプリケーションを接続しようとしていました。私は、アプリケーションがサーバーのIPアドレスに接続していて、サーバー上でテスト用にnetcatを使用していました。実行中、アプリケーションからのコンソール出力は、サーバーに正常に接続したことを示しました。ただし、ストリームデリゲートは反応しないようです。 netcatに入力したとき、アプリコンソールは何も印刷しませんでした。私はかなり長い間検索してきました。私の実装は他のものとかなり似ています。多分私はここに見えない何かを見逃しています。Swiftの非応答ストリームデリート

この問題について考えていただければ幸いです。

コードを以下に添付されています

import UIKit 

class ViewController: UIViewController, StreamDelegate { 

    let addr:String = "52.34.56.78" 
    let port:Int = 1234 

    var inputStream: InputStream? 
    var outputStream: OutputStream? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.connect(host: addr, port: port) 
    } 

    func connect(host: String, port: Int) { 

     Stream.getStreamsToHost(withName: host, port: port, inputStream: &inputStream, outputStream: &outputStream) 

     if inputStream != nil && outputStream != nil { 

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

      inputStream!.schedule(in: RunLoop.main, forMode: RunLoopMode.defaultRunLoopMode) 
      outputStream!.schedule(in: RunLoop.main, forMode: RunLoopMode.defaultRunLoopMode) 

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

      print("successfully connected") 
     } 
     else { 
      print("connection unsuccessful") 
     } 
    } 

    func stream(aStream: Stream, handleEvent eventCode: Stream.Event) { 

     if aStream === inputStream { 
      switch eventCode { 
      case Stream.Event.errorOccurred: 
       print("input: ErrorOccurred: \(aStream.streamError?.localizedDescription)") 
       break 
      case Stream.Event.openCompleted: 
       print("input: OpenCompleted") 
       break 
      case Stream.Event.hasBytesAvailable: 
       print("input: HasBytesAvailable") 
       break 
      default: 
       break 
      } 
     } 
     else { 
      print("unknown stuff happened") 
     } 
    } 
} 
+0

アプリはサーバーに接続できたようですが、stream()関数はまったくトリガーされませんでした。 'inputStream.hasBytesAvailable'をチェックしたとき、' netcat'で何かを送った後、trueを返しました。私はこれがストリームデリゲートを適切に構成していないか、または実行ループかもしれないと考えていると思われます。 – cafemike

答えて

9

ので試行錯誤の多くの後、私は最終的に、この関数のシグネチャは廃止/間違っているという理由だけでストリーム()関数は動作しませんでした実現しました。ここで

は、私が使っていたものです。

func stream(aStream: Stream, handleEvent eventCode: Stream.Event)

をしかし、本当にそれは次のようになります。

func stream(_ aStream: Stream, handle eventCode: Stream.Event)

これはおそらくスウィフト3.に以前スウィフトバージョンからの構文変換ですXCodeコンパイラは通常、古くなった関数/構文を検出しますが、残念ながらこれをキャッチしませんでした。

私の答えは、まだこの問題に苦しんでいる人を助けてくれるはずです。

+0

私はこの問題を長い間把握しようとしてきました。投稿してくれてありがとう – humblebeast

+0

あなたはバッファがいっぱいになった後にどのようにフラッシュするのか知っていますか? – humblebeast

+1

私が助けることができてうれしい!私はあなたのread()関数にループを入れることができると思います。基本的には読み込み可能なバイトがあるときは常に、read()関数が動作しているはずです。バッファサイズの制限を設定することもできます。これにより、read()が_x_バイト数の処理を完了するたびに、応答全体が受信されるのを待つことなく解析を進めることができます。 – cafemike

関連する問題