【问题标题】:Cocoaasyncsocket problem, GCDAsyncSocket Connection problemCocoaasyncsocket 问题,GCDAsyncSocket 连接问题
【发布时间】:2020-01-20 12:32:33
【问题描述】:

为什么当尝试连接时服务器没有响应“try”表明已经连接?

我需要检查连接状态。每次,尽管设置了超时,但它显示它已连接...

我的代码:

        socket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main)
        do {
            try socket?.connect(toHost: "192.168.1.1", onPort: 5000, withTimeout: 5)
            print ("connect")

        }catch  {
            print("socket error")

        }

并且 还有一个问题,

我在同一个端口上创建了两个套接字:

socket1.connect(toHost: "192.168.1.1", onPort: 5000, withTimeout: 5)
socket2.connect(toHost: "192.168.1.1", onPort: 5000, withTimeout: 5)

在函数中:

func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
 ...
}

如何检测哪个套接字(socket1 或 socket2)已断开连接?

【问题讨论】:

    标签: swift cocoaasyncsocket


    【解决方案1】:

    GCDAsyncSocket 确实有委托方法(在上面的代码示例中,您确实将委托设置为self)。所以用这个函数的 Swift 等价物实现一个小函数:

    - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port

    类似:

    socket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main)
    do {
        // I don't think socket should be optional here...
        try socket.connect(toHost: "192.168.1.1", onPort: 5000, withTimeout: 5)
    
    } catch  {
        print("socket error")
    
    }
    
    func socket(socket : GCDAsyncSocket, didConnectToHost host:String, port p:UInt16)
    {
        print("connected to \(host) & \(port)")
    }
    

    您将“print("connected!")”移到了那里。如果套接字已连接,您将在控制台中看到打印。

    【讨论】:

    • 连接不上怎么办?如何检查?感谢您的回答。
    • 如果出现错误,您应该会在控制台中看到“socket error”。这就是您的catch 案例的用途。
    • 嗯,问题是没有错误。我写的是“已连接”,即使它没有连接。
    • 所以didConnectToHost 方法确实会触发(如果您在此处设置断点,它会命中并停止Xcode 执行吗?)。我刚刚更新了“已连接”行。连接了哪些主机和端口?
    • 如果服务器正在运行我有:连接到 192.168.1.1 & 5000 如果服务器没有运行我没有任何错误...
    【解决方案2】:

    我会为每个套接字上的“tag”属性分配一个值,然后在委托上比较 socket.tag 参数以确定哪个已断开连接。

    socket1.tag = 1
    socket2.tag = 2
    
    
    func socket(socket : GCDAsyncSocket, didConnectToHost host:String, port p:UInt16)
    {
        if (socket.tag==1) {
           print("Socket 1 disconnected")
        } 
    }
    

    【讨论】:

    • “GCDAsyncSocket”类型的值?没有成员“标签”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2011-02-15
    • 2011-06-07
    • 2020-05-14
    相关资源
    最近更新 更多