With my iPad as a TCP client, using CocoaAsync I am able to send utf-8 messages successfully to the other device (none iOS), but unable to receive them. None of the print statements nor the text I have even worked:
Message Receiver:
import Foundation
import CocoaAsyncSocket
import Combine
class MessageManager: ObservableObject {
private var receiver: MessageReceiver!
@Published var receivedMessage: String = ""
init() {
receiver = MessageReceiver(delegate: self, ipAddress: "//IP ADDRESS//", port: //PORT//)
}
}
extension MessageManager: MessageReceiverDelegate {
func didReceiveMessage(_ message: String) {
DispatchQueue.main.async {
self.receivedMessage = message
}
}
}
protocol MessageReceiverDelegate: AnyObject {
func didReceiveMessage(_ message: String)
}
class MessageReceiver: NSObject {
weak var delegate: MessageReceiverDelegate?
private var socket: GCDAsyncSocket!
init(delegate: MessageReceiverDelegate, ipAddress: String, port: UInt16) {
super.init()
self.delegate = delegate
socket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main)
do {
try socket.connect(toHost: ipAddress, onPort: port)
print("Socket connecting to \(ipAddress) on port \(port)")
} catch {
print("Error connecting to server:", error.localizedDescription)
}
}
}
extension MessageReceiver: GCDAsyncSocketDelegate {
func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {
print("Socket connected to \(host) on port \(port)")
sock.readData(withTimeout: -1, tag: 0)
}
func socket(_ sock: GCDAsyncSocket, didAcceptNewSocket newSocket: GCDAsyncSocket) {
print("New connection established.")
newSocket.readData(withTimeout: -1, tag: 0)
}
func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {
print("Received data length:", data.count)
if let message = String(data: data, encoding: .utf8) {
print("Received message:", message)
delegate?.didReceiveMessage(message)
} else {
print("Error converting data to string.")
}
sock.readData(withTimeout: -1, tag: 0)
}
func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
if let error = err {
print("Socket disconnected with error:", error.localizedDescription)
} else {
print("Socket disconnected.")
}
}
}
Main Content, I deleted some of the stuff pertaining to other parts
import SwiftUI
struct ContentView: View {
@StateObject private var messageManager = MessageManager() // Use @StateObject here
var body: some View {
ZStack {
VStack {
Spacer()
// Display received message
Text("Received Message: \(messageManager.receivedMessage)")
.padding()
}
}
.edgesIgnoringSafeArea(.all)
}
}