"hasBytesAvailable" не вызывается - PullRequest
       2

"hasBytesAvailable" не вызывается

0 голосов
/ 06 сентября 2018

Я могу записать в сокет, но не могу прочитать вывод с сервера. Мой сервер принимает входные данные и преобразовывает их в верхний регистр и выдает выходные данные. Я не могу получить вывод.

Я попытался выполнить поиск в Google, но не нашел решения. Я пытался не закрывать соединение, но не повезло.

class ViewController: NSViewController , StreamDelegate{

@IBOutlet weak var txtMessage: NSTextField!
@IBOutlet weak var lblOutput: NSTextField!

var inputStream: InputStream?
var outputStream: OutputStream?
var readStream : Unmanaged<CFReadStream>?
var writeStream : Unmanaged<CFWriteStream>?

override func viewDidLoad() {
    super.viewDidLoad()
    setupConnection()
    // Do any additional setup after loading the view.
}

override func viewWillAppear() {

}

override var representedObject: Any? {
    didSet {
    // Update the view, if already loaded.
    }
}

@IBAction func btnSendMsg(_ sender: NSButton) {
    let strData = txtMessage.stringValue
    send(message: strData)

}

func setupConnection(){
    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, "localhost" as CFString, 6688, &readStream, &writeStream)
    open()
}

func open(){
    print("Opening streams.")
    inputStream = readStream?.takeRetainedValue()
    outputStream = writeStream?.takeRetainedValue()
    outputStream?.delegate = self
    inputStream?.delegate = self
    outputStream?.schedule(in: .current, forMode: .defaultRunLoopMode)
    inputStream?.schedule(in: .current, forMode: .defaultRunLoopMode)
    outputStream?.open()
    inputStream?.open()
}

func close() {
    print("Closing streams.")
    inputStream?.close()
    outputStream?.close()
    inputStream?.remove(from: .current, forMode: .defaultRunLoopMode)
    outputStream?.remove(from: .current, forMode: .defaultRunLoopMode)
    inputStream?.delegate = nil
    outputStream?.delegate = nil
    inputStream = nil
    outputStream = nil
}

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

    switch eventCode {
    case Stream.Event.hasBytesAvailable:
        print("new message received")
        if aStream == inputStream {
            var dataBuffer = Array<UInt8>(repeating: 0, count: 1024)
            var length: Int
            while (inputStream?.hasBytesAvailable)! {
                length = (inputStream?.read(&dataBuffer, maxLength: 1024))!
                if length > 0 {
                    let output = String(bytes: dataBuffer, encoding: .ascii)
                    if nil != output {
                        print("server said: \(output ?? "")")
                        messageReceived(message: output!)
                    }
                }
            }
        }

    case Stream.Event.endEncountered:
        aStream.close()
        aStream.remove(from: RunLoop.current, forMode: .defaultRunLoopMode)
        print("close stream")
    case Stream.Event.errorOccurred:
        print("error: \(aStream.streamError?.localizedDescription ?? "")")
    case Stream.Event.hasSpaceAvailable:
        print("has space available")
    case Stream.Event.openCompleted:
        print("Opened")
    default:
        print("some other event...")
        break
    }
}
func messageReceived(message: String){
    print("messageReceived :",message)
    lblOutput.stringValue = message
}

func send(message: String){

    let strSend = message
    let buffer = [UInt8](message.utf8)
    if let _ = strSend.data(using: .ascii) {
        outputStream?.write(buffer, maxLength: buffer.count)
    }

    print("messageSent :",message)
    close()

}

}

1 Ответ

0 голосов
/ 10 сентября 2018

Я нашел ответ на поставленный выше вопрос.

func setupConnection(){
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, "localhost" as CFString, 6688, &readStream, &writeStream)
open()}

заменить вышеуказанный код на:

func setupConnection(){
Stream.getStreamsToHost(withName: "localhost", port: 6688, inputStream: &self.inputStream, outputStream: &self.outputStream)
open()}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...