【问题标题】:TCP socket connection using CFStreamCreatePairWithSocketToHost not Working使用 CFStreamCreatePairWithSocketToHost 的 TCP 套接字连接不起作用
【发布时间】:2015-11-01 05:27:37
【问题描述】:

我是快速编程的新手。我正在尝试从我的 ios 应用程序连接到服务器套接字。我有一个视图控制器,并且在一个按钮操作中我正在调用该函数以连接到套接字服务器

let socketConn = Connection();
socketConn.connect();

我已经在Connection类中将delegate设置为self,但是连接到服务器socket后我的stream函数没有触发。

class Connection : NSObject, NSStreamDelegate {
        let serverAddress: CFString = "192.168.1.104"
        let serverPort: UInt32 = 5012

        private var inputStream: NSInputStream!
        private var outputStream: NSOutputStream!

        func connect() {
            println("connecting...")

            var readStream:  Unmanaged<CFReadStream>?
            var writeStream: Unmanaged<CFWriteStream>?

            CFStreamCreatePairWithSocketToHost(nil, self.serverAddress, self.serverPort, &readStream, &writeStream)

            self.inputStream = readStream!.takeRetainedValue()
            self.outputStream = writeStream!.takeRetainedValue()

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

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

            self.inputStream.open()
            self.outputStream.open()
        }

        func stream(stream: NSStream, handleEvent eventCode: NSStreamEvent) {
            println("stream event")
        }
    }

谁能帮我调试一下为什么在连接时调用流函数?

【问题讨论】:

标签: ios sockets tcp io


【解决方案1】:

我正在使用 NSStream 类的 getStreamsToHostWithName 函数。比 CFStreamCreatePairWithSocketToHost

 func initNetworkCommunication() {

    print("connecting...")

    let serverAddress = "gzoa.vps.infomaniak.com"
    let serverPort = 1234

    NSStream.getStreamsToHostWithName(serverAddress, port: serverPort, inputStream: &inputStream, outputStream: &outputStream)

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

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

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

【讨论】:

    【解决方案2】:

    你可以用这个

    import Foundation
    
    typealias OnComing = (String!) -> (Void)
    
    class SocketClient: NSObject, StreamDelegate {
    
        var host:String?
        var port:Int?
        var inputStream: InputStream?
        var outputStream: OutputStream?
    
        var status = false;
        var output = ""
        var bufferSize = 1024;
    
        var onComing:OnComing!
    
        func makeCFStreamConnection(host: String, port: Int, onComing:@escaping OnComing) {
    
            self.host = host
            self.port = port
            self.onComing = onComing
    
            Stream.getStreamsToHost(withName: host, port: port, inputStream: &self.inputStream, outputStream: &self.outputStream)
    
            if self.inputStream != nil && self.outputStream != nil {
    
                self.inputStream!.delegate = self
                self.outputStream!.delegate = self
    
                self.inputStream!.schedule(in: .main, forMode: RunLoopMode.defaultRunLoopMode)
                self.outputStream!.schedule(in: .main, forMode: RunLoopMode.defaultRunLoopMode)
    
                self.inputStream!.open()
                self.outputStream!.open()
    
            }
    
    
        }
    
        func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
            if aStream === self.inputStream {
                switch eventCode {
                case Stream.Event.errorOccurred:
                    break
                case Stream.Event.openCompleted:
                    break
                case Stream.Event.hasBytesAvailable:
                    read()
                    break
                default:
                    break
                }
            } else if aStream === self.outputStream {
                switch eventCode {
                case Stream.Event.errorOccurred:
                    break
                case Stream.Event.openCompleted:
                    break
                case Stream.Event.hasSpaceAvailable:
                    break
                default:
                    break
                }
            }
        }
    
        func read() {
            output = ""
            var buffer = [UInt8](repeating: 0, count: bufferSize)
            while (self.inputStream!.hasBytesAvailable) {
                let bytesRead: Int = inputStream!.read(&buffer, maxLength: buffer.count)
                if bytesRead >= 0 {
                    output += NSString(bytes: UnsafePointer(buffer), length: bytesRead, encoding: String.Encoding.ascii.rawValue)! as String
                } else {
                    print("# Stream read() error")
                }
            }
            self.onComing(output)
        }
    
        func write(message:String) {
            let encodedDataArray = [UInt8]("\(message)\n".utf8)
            self.outputStream?.write(encodedDataArray, maxLength: encodedDataArray.count)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多