0

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)
    }
}
HangarRash
  • 7,314
  • 5
  • 5
  • 32
  • I would suggest you use [NWConnection](https://developer.apple.com/documentation/network/nwconnection) rather than a 3rd party library https://gist.github.com/ruurdadema/8954b39853b97babed6c62297712b1af – Paulw11 Aug 17 '23 at 05:58

0 Answers0