2016-12-14 6 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', он вернул true после того, как я отправил что-то через' netcat'. Я подозреваю, что это связано с неправильной настройкой делегата потока или, может быть, с циклом запуска. – cafemike

ответ

9

Таким образом, после много проб и ошибок, я, наконец, понял, что функция потока() не работает только потому, что подпись этой функции неправильна/устаревает.

Вот что я использую:

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

Но на самом деле это должно быть:

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

Это, вероятно, преобразование синтаксиса от предыдущей версии Swift Свифт 3. Компилятор XCode обычно обнаруживает устаревшие функции/синтаксис, но, к сожалению, этого не поймал.

Надеюсь, мой ответ может помочь тем, кто по-прежнему страдает от этой проблемы.

+0

Я тоже долго пытался выяснить эту проблему; спасибо за сообщение – humblebeast

+0

Знаете ли вы, как бы вы сбросили после заполнения буфера? – humblebeast

+1

Рад, что я могу помочь! Я думаю, вы можете поместить цикл в свою функцию read(). Поэтому в основном, когда есть доступные для чтения байты, ваша функция read() должна работать. Вы также можете установить ограничение размера буфера, так что всякий раз, когда read() обрабатывает _x_ количество байтов, вы можете продолжить разбор, не дожидаясь получения всего ответа. – cafemike

Смежные вопросы