ios - GCDAsyncSocket 客户端在写入之前不读取

标签 ios objective-c cocoa bonjour gcdasyncsocket

要包含的代码不多,但为什么 GCDAsyncSocket 客户端可能会在写入数据排队之前停止读取?症状:

  • 虽然服务器调用“didAcceptNewSocket”,但“didConnectToHost”没有被调用。
  • 服务器写入数据时不调用“didReadData”
  • “socketDidDisconnect”没有被调用
  • 来自客户端的写入得到正确传输

奇怪的是,调用“writeDelayed”方法(仅将“writeData”方法排入队列)可以正确处理所有读取。从方法中删除“writeData”会禁用读取。

这让我认为配置的 GCD 调度队列是错误的,所以我尝试了所有可能的新的和默认的串行和并发队列

或者说套接字对象提前释放了,所以我把它设为类属性,但没有用。

可能使事情复杂化的一件事(虽然我不知道如何)是,正在建立连接以响应已解析的 NSNetService (Bonjour) 对象,该对象可能位于不同的调度队列中。但是我尝试将“setupConnection”包装在一个要在主队列上执行的 block 中,但无济于事。

这里有少量代码,如果有问题我会编辑。

谢谢, 詹姆斯

-(void)setupConnection
{
     self.queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);

     self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:self.queue];
}

-(void)connect
{
     NSError *error = nil;
     if(![self.socket connectToHost:self.socketInfo.address onPort:self.socketInfo.port error:&error])
     {
          NSLog(@"I goofed: %@", error);
     }
     NSLog(@"Connecting to: %@:%i",self.socketInfo.address,self.socketInfo.port);
}

-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
    NSLog(@"Connected");
    [self.socket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0];
}

-(void)writeDelayed
{
    double delayInSeconds = 2000000.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        NSData* dataObj = [GCDAsyncSocket CRLFData];
        [self.socket writeData:dataObj withTimeout:-1 tag:1];
    });
}
...

最佳答案

答案是我的对象链中较高的对象之一被提前释放,导致套接字也被提前释放。这似乎是对智者的话。

关于ios - GCDAsyncSocket 客户端在写入之前不读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15845207/

相关文章:

cocoa - 为什么打印时我的所有 View 都会移至左下角?

objective-c - 在快速枚举中输入正确的值

ios - 使用 UIDatePicker 而不是键盘来处理 UITextField 问题

ios - 如何在使用自定义 UITableViewCell 创建 UITableViewCell 后覆盖它?

ios - 查明两个日期之间是否已经过去了两个日历日

ios - 协议(protocol)和委托(delegate)之间的区别?

cocoa - cocoa 中的客户端到客户端消息传递?

ios - 使用 swift 3 从文件加载 json

ios - UITableViewCell 内的 UILabel 高度

ios - TableView 在某些索引后显示重复数据