3

アプリケーションでソケット接続を使用しています。

これが私のSocketConnection.swift

    init(host: String, port:UInt32){
        self.host = host
        self.port = port
        self.status = false
        output = ""
        super.init()
    }

    func stream(aStream: NSStream, handleEvent aStreamEvent: NSStreamEvent) {
        switch aStreamEvent {

        case NSStreamEvent.OpenCompleted:
            break

        case NSStreamEvent.HasBytesAvailable:

            break

        case NSStreamEvent.HasSpaceAvailable:
            break

        case NSStreamEvent.EndEncountered:

//            aStream.close()
            aStream.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
            break

        case NSStreamEvent.None:

            break

        case NSStreamEvent.ErrorOccurred:

            break

        default:
            println("# something weird happend")
            break
        }
    }

    func connect() {
        println("# connecting to \(host):\(port)")
        var cfReadStream : Unmanaged<CFReadStream>?
        var cfWriteStream : Unmanaged<CFWriteStream>?

        CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &cfReadStream, &cfWriteStream)
        inputStream = cfReadStream!.takeRetainedValue()
        outputStream = cfWriteStream!.takeRetainedValue()

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

        inputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
        outputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)

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


    func read(){  
        var buffer = [UInt8](count: bufferSize, repeatedValue: 0)
        output = ""
        while (self.inputStream!.hasBytesAvailable){
            var bytesRead: Int = inputStream!.read(&buffer, maxLength: buffer.count)
            if bytesRead >= 0 {
                output += NSString(bytes: UnsafePointer(buffer), length: bytesRead, encoding: encoding)! as String
            } else {
                println("# error")
            }
            println("> \(output)")
        }
    }

    func send(message:String){        
            let data:NSData = message.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
            let bytesWritten = self.outputStream!.write(UnsafePointer(data.bytes), maxLength: data.length)
            println("< send to \(host)")

    }

私のViewController.swiftでは、このようにサーバーに接続しています

var socketConnection = SocketConnection(host: _ip, port: _port) 
socketConnection.connect() 
socketConnection.send(urlString) 
socketConnection.read()

NSStreamEvent.HasBytesAvailableこれで、ソケット経由で URL 文字列を送信できますが、明示的に読み取っているときに、サーバーの応答を出力するケースから同じ読み取り関数を呼び出すと、サーバーからデータを取得できません..しかし、どうすればイベントキューをトリガーできますか?

これを明示的に呼び出したいsocketConnection.read()..どうすればいいですか?

接続の 2 秒後、接続チャネルが閉じられます。閉じるまで接続を維持したいと思います。

この問題から私を助けてください。

ありがとう

4

2 に答える 2

0

読み取り機能を明示的に呼び出す必要はありません。以下のように読み取り関数を変更し、Stream.Event.hasBytesAvailable: の場合に呼び出します。

func read(stream: InputStream) {
let maxReadLength = 1024
var buffer = [uint8](repeating: 0, count: maxReadLength)
while stream.hasBytesAvailable {
    let numberOfBytesRead : Int = stream.read(&buffer, maxLength: maxReadLength)
    if numberOfBytesRead < 0 {
        if let _ = stream.streamError {
            break
        }
    }

    if let message = processedMessageString(buffer: buffer, length: numberOfBytesRead) {
        delegate?.receivedMessage(message: message)
    }
}}

read() を明示的に呼び出したい場合は、ストリームをパラメーターとして渡し、ViewController クラスで read 関数を呼び出す必要があります—</p>

socketConnection.read(stream)
于 2019-01-30T06:00:22.237 に答える