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
}
}