ios - GCDAsyncSocket 不向 TCP 套接字服务器发送数据

标签 ios swift sockets tcpclient

我正在创建一项功能,允许您在 iOS 设备和本地网络中的其他计算机之间共享图片。

当我向套接字写入数据时遇到了问题,但直到我关闭连接后数据才被传送。据我所知应该有类似 flush() 方法。因为它的行为就像我断开连接时发生的那样。

因此,如果有人可以为该问题提供帮助或提出更好的解决方案,那就完美了。

这是我的经理类:

import CocoaAsyncSocket

class CollaborationSocketConnectionService: NSObject, GCDAsyncSocketDelegate {

    static let shared = CollaborationSocketConnectionService()

    var tcpSocket: GCDAsyncSocket?

    private var ipAddress = ""
    private var port = 0
    private var guid = String()

    override init() {
        super.init()
        tcpSocket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main)
        guid = UUID().uuidString.lowercased()
    }


    // MARK: - General Functions

     func connectToSocket(at ip: String, port: Int) {
        self.ipAddress = ip
        self.port = port
            do {
                try tcpSocket?.connect(toHost: ip, onPort: UInt16(port), withTimeout: -1)
            } catch let error {
                print("Cannot open socket to \(ip):\(port): \(error)")
                tcpSocket = nil
            }
        }



    func disconnect() {
        tcpSocket?.disconnect()
    }

    func sendImage(image: UIImage?) {
        if !(tcpSocket?.isConnected ?? false) {
            try? tcpSocket?.connect(toHost: self.ipAddress, onPort: UInt16(self.port), withTimeout: -1)
        }
        guard let data =  image?.jpegData() else {return}
        let base64Image = data.base64EncodedString()

        let imageModel = UploadImage(contentLength: 666, command: "UploadImage", uuid: guid, imageData: ImageData(fileSize: base64Image.count, fileGuid: UUID().uuidString.lowercased(), blocksCount: 1, blockIndex: 0, blockLength: base64Image.count, data: base64Image))
        let encoder = JSONEncoder()
        let jsonData = try? encoder.encode(imageModel)
        self.tcpSocket?.write(jsonData!, withTimeout: 10, tag: 1)
    }


    // MARK: - GCDAsyncSocketDelegate

        func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {
            print("connected")
            sock.readData(withTimeout: -1, tag: 0)
        }

        func socket(_ sock: GCDAsyncSocket, didWritePartialDataOfLength partialLength: UInt, tag: Int) {
            if tag == 0 {
                print("written")
            }
        }

        func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {
            if tag == 0 {
                print("First Chunk sent")
//                self.tcpSocket?.disconnect()
//                self.tcpSocket?.perform {
//                    self.tcpSocket?.disconnectAfterWriting()
//                }
//                self.connectToSocket(at: self.ipAddress, port: self.port)
            }
            if tag == 1 {
                print("Second Chunk sent")
            }
            if tag == 99 {
                print("KEK")
            }
        }

    func socket(_ sock: GCDAsyncSocket, didReadPartialDataOfLength partialLength: UInt, tag: Int) {
        print(partialLength)
    }

        func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {
            let stringFromServer = String(bytes: data, encoding: .utf8)
            print("READED DATA \(stringFromServer!)")
        }

    func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
        print("DISCONNECTED")
    }

最佳答案

然后我找到了解决方案。 只需在消息末尾添加“\n”...

let jsonDataString = String(bytes: try! encoder.encode(imageModel), encoding: .utf8)! + "\n"
let jsonData = jsonDataString.data(using: .ascii)

关于ios - GCDAsyncSocket 不向 TCP 套接字服务器发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58858726/

相关文章:

ios - 如何将多个 PDF 文件合并为一个 PDF

objective-c - 写入驻留在 Xcode 项目目录中的文件

ios - 如何使 ViewController 中的 3 个文本字段仅接受整数输入 - XCode

ios - Swift FB 应用程序邀请显示空白页面

javascript - 如何将 Socket.io 路由代码分离到不同的文件中

objective-c - 如何垂直移动 UITableView

objective-c - 一种获取 Cocoa (Swift/Obj-C) 中所有声明的 UTI 的方法...和/或确定应用程序包定义的 UTI?

swift - 如何使用 Swift #selector 语法解决 "ambiguous use of"编译错误?

C#、异步套接字服务器/客户端、StackOverflowException

spring - JavaFX 桌面应用程序 - 与 Web 服务的套接字通信