TCP socket connection is succesful but not able to write anything on output stream

257 Views Asked by At

Typically TCP socket delegate get called with "bytesAvailble" after successfully recieving any message from client to server. Connection is getting successful. getting call back with "SpaceAvailable" messages are being sent but not getting call back. No problem in client because the old Objective-C code is working fine.

class ViewController: UIViewController, StreamDelegate {
    var inputStream: InputStream?
    var outputStream: OutputStream?
    
    var messageQueue = [String]()
    
    var timer : Timer!
    var writeReady = false
    
    var timeInterval = 2.0
    
    var clientSocket: Int32!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.startTCP()
    }
    
    func startTCP(){
        self.connectToServer(host: "192.168.0.200", port: 50001)
    }
    
    func connectToServer(host: String, port: Int) {
        Stream.getStreamsToHost(withName: host, port: port, inputStream: &inputStream, outputStream: &outputStream)
        
        inputStream?.delegate = self
        outputStream?.delegate = self
        
        inputStream?.schedule(in: RunLoop.current, forMode: .common)
        outputStream?.schedule(in: RunLoop.current, forMode: .common)
        
        inputStream?.open()
        outputStream?.open()
        print("connection successful")
    }
    
    func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
        switch eventCode {
        case .openCompleted:
            if aStream == outputStream {
                print("open completed for output stream")
                writeReady = true
                sendConnectionMessage()
                startHeartBeat()
            }
        case .hasBytesAvailable:
            print("bytes avaialble")
            guard let inputStream = inputStream else {
                print("Input stream is nil")
                return
            }
            let bufferSize = 1024
            var buffer = Array<UInt8>(repeating: 0, count: bufferSize)
            let bytesRead = inputStream.read(&buffer, maxLength: bufferSize)
            if bytesRead > 0 {
                let receivedMessage = String(bytes: buffer, encoding: .utf8)!
                print("Received message: \(receivedMessage)")
            }
        case .errorOccurred:
            print("Error occurred: \(aStream.streamError!.localizedDescription)")
            disconnect()
            stopHeartBeat()
            startTCP()
        case .endEncountered:
            print("End encountered")
        case .hasSpaceAvailable:
            print("space available")
            
            if(aStream == self.outputStream)
            {
                handleMessageQueue()
            }
        default:
            print("Unknown event")
        }
    }
    
    func handleMessageQueue(){
        if messageQueue.count>0 {
            if let message = messageQueue.first {
                sendMessage(message)
                messageQueue.removeFirst()
            }
        } else {
            //handle empty queue
        }
    }
    
    @objc func sendConnectionMessage() {
        messageQueue.append("{\"msg.type\":\"Connection\",\"source.address\":\"192.168.0.126\"}")
    }
    
    func sendMessage(_ message: String) {
        if !writeReady{ return }
        
        guard let outputStream = outputStream else {
            print("Output stream is nil")
            return
        }

        let data = message.data(using: .utf8)!
        print("writing")
        //        let bytesWritten = outputStream.write(data: data)
        
        let bytesWritten = data.withUnsafeBytes { outputStream.write($0, maxLength: data.count) }
        
        if bytesWritten < 0 {
            print("Error sending message")
        } else {
            print("Sent message: \(message)")
        }
    }
    
    func startHeartBeat(){
        timer = Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: true, block: { _ in
            self.sendMessage("{\"msg.data\":[{\"Dev.ID\":\"0\",\"Dev.inst\":\"0\"}],\"msg.type\":\"Register\"}\n")
        })
    }
    
    func stopHeartBeat(){
        if timer == nil { return }
        timer.invalidate()
    }
    
    func disconnect() {
        inputStream?.close()
        outputStream?.close()
        inputStream = nil
        outputStream = nil
    }
}
0

There are 0 best solutions below