【问题标题】:socket closed by remote peer gcdasyncsocket远程对等 gcdasyncsocket 关闭的套接字
【发布时间】:2016-08-20 01:43:30
【问题描述】:

使用 xmppframework 创建聊天应用程序。当我尝试连接到服务器时,它会立即连接并断开连接并引发以下错误。

error domain=gcdasyncsocketerrordomain code=7 socket closed by remote peer

在 Adium(聊天应用)软件上也是如此。想知道在 AWS 服务器上设置 Openfire 时是否有任何设置错误。

https://community.igniterealtime.org/thread/50643

如果我需要执行任何步骤等,请告诉我。

感谢阅读。

【问题讨论】:

    标签: ios sockets mqtt openfire xmppframework


    【解决方案1】:

    委托方法socket:didAcceptNewSocket被调用时必须存储新的socket

    @property (nonatomic, strong) NSMutableArray *socketsArray;
    
    - (void)viewDidLoad {
        _socketsArray = [[NSMutableArray alloc] init];
    }
    
    - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket {
        [_socketsArray addObject:newSocket];
    }
    

    【讨论】:

      【解决方案2】:

      当我尝试使用 1885 端口号时遇到了同样的错误。

      我在现有代码中添加了以下代码:

      mqttReference?.dispatchQueue = DispatchQueue.global(qos: .userInitiated)
              //mqttReference?.logLevel = .debug
              mqttReference?.enableSSL = true
              mqttReference?.sslSettings = [
                  GCDAsyncSocketManuallyEvaluateTrust: NSNumber(booleanLiteral: true),
                  GCDAsyncSocketUseCFStreamForTLS: NSNumber(booleanLiteral: false),
                  kCFStreamSSLPeerName as String: "" as NSString,
                  GCDAsyncSocketSSLProtocolVersionMin: NSNumber(integerLiteral: Int(SSLProtocol.tlsProtocol1.rawValue)),
                  GCDAsyncSocketSSLProtocolVersionMax: NSNumber(integerLiteral: Int(SSLProtocol.tlsProtocol12.rawValue)),
              ]
      

      我现在的完整代码:

      //  let clientID = "CocoaMQTT-" + String(ProcessInfo().processIdentifier)
          mqttReference = CocoaMQTT(clientID: "", host: mqttProfile.baseURL, port: UInt16(mqttProfile.port))
          mqttReference?.username = mqttProfile.userName
          mqttReference?.password = mqttProfile.password
          mqttReference?.allowUntrustCACertificate = true
          
          
          mqttReference?.dispatchQueue = DispatchQueue.global(qos: .userInitiated)
          //mqttReference?.logLevel = .debug
          mqttReference?.enableSSL = true
          mqttReference?.sslSettings = [
              GCDAsyncSocketManuallyEvaluateTrust: NSNumber(booleanLiteral: true),
              GCDAsyncSocketUseCFStreamForTLS: NSNumber(booleanLiteral: false),
              kCFStreamSSLPeerName as String: "" as NSString,
              GCDAsyncSocketSSLProtocolVersionMin: NSNumber(integerLiteral: Int(SSLProtocol.tlsProtocol1.rawValue)),
              GCDAsyncSocketSSLProtocolVersionMax: NSNumber(integerLiteral: Int(SSLProtocol.tlsProtocol12.rawValue)),
          ]
          
          
          mqttReference?.autoReconnect = true
          mqttReference?.backgroundOnSocket = mqttProfile.allowBackgroundMQTT
          mqttReference?.delegate = self
          do {
              if((mqttReference?.connect())!){
                 ...........
      
      
      Now it's working fine.
      

      【讨论】:

        【解决方案3】:

        请查看此 github 链接,

        Socket closed by remote peer" - GCDAsyncSocket Error Code 7

        这是由于服务器可能因为空闲时间而关闭连接。您需要继续向服务器发送 ping。

        如回答中所说,

        服务器关闭连接的两个原因:

        1. 如果客户端空闲,您不会发送常规 ping。
        2. 您正在使用相同的凭据从某些不同的客户端登录,并且在服务器设置中有以下设置: 总是踢 - 如果有资源冲突,立即踢另一个资源。在服务器>服务器设置>资源策略。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-04
          • 2011-07-25
          • 2012-11-08
          • 2013-03-02
          • 2017-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多