如何在同一个 GCDAsyncSocket 对象上“connectToHost:”和“acceptOnPort:”?

Posted

技术标签:

【中文标题】如何在同一个 GCDAsyncSocket 对象上“connectToHost:”和“acceptOnPort:”?【英文标题】:How to "connectToHost:" and "acceptOnPort:" on same GCDAsyncSocket object? 【发布时间】:2017-06-30 10:27:35 【问题描述】:

我正在尝试在同一个 GCDAsyncSocket 对象上“send to”和“receive from”,但它在尝试初始化对象时返回错误为Attempting to accept while connected or accepting connections. Disconnect first. .

我的代码:

-(instancetype)initWithHost:(NSString *)host port:(NSInteger)port userData:(NSDictionary *)userData delegate:(id<AKSenderSocketDelegate>)delegate

  self = [super init];
  if (self)
  
     self.delegate = delegate;
     self.senderSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
     self.senderSocket.userData = userData;

    NSError *err = nil;

    //---- Sender
    if (![self.senderSocket connectToHost:host onPort:port error:&err])
    
        NSLog(@"Failed to connect: %@", err);
    
    else
    
        NSLog(@"Connected to :%@:%ld",host,(long)port);
    

    //---- Listener
    if (![self.senderSocket acceptOnPort:0 error:&err])
    
        NSLog(@"Failed to open lintening port. :%@",err.localizedDescription);
    
    else
    
        NSLog(@"Listening to port :%hu and host :%@",self.senderSocket.localPort,self.senderSocket.localHost);
    
  
   return self;

请帮忙!!

【问题讨论】:

【参考方案1】:

你把布丁煮过头了(笑)。连接后,您就可以开始通信了。不需要接受消息。

connectToHost:onPort:error: 就像拨打电话:您拨打电话,对方接听(因为对方已经通过acceptOnPort:error: 或其等效项提供自己的服务)。建立连接后,您可以在同一个套接字上读取数据;套接字是双向的。

因此,如果您想“拨打电话”,请使用connectToHost:onPort:error:。如果您想等待对方拨打电话,请使用acceptOnPort:error:。无论对话的哪一方是“连接者”或“接受者”,对话双方都可以发送(写)和收听(读)。

【讨论】:

以上是关于如何在同一个 GCDAsyncSocket 对象上“connectToHost:”和“acceptOnPort:”?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中通过 GCDAsyncsocket 读取 xml 文件

浏览器上的 GCDAsyncSocket 立即连接和断开连接,并出现“远程对等方关闭套接字”错误

GCDAsyncSocket - 不接收数据 - AsyncSocket 工作正常

GCDAsyncSocket 未接收到所有传输的数据,缺少最后一个“块”

(六十五)iOS的socket实现(GCDAsyncSocket)

没有同时读取数据GCDAsyncSocket