0

我正在使用 GCDAsyncSocket(ios 设备)建立 UDP 连接。一切正常,我能够发送和接收消息,我的问题是我想快速交换数据。我可以从我的 iphone 向 pc 发送相当快的数据,但我无法以这种速度从 pc 获取数据,更具体地说,我希望能够每 100 毫秒获取一次数据。我连接成功时使用此功能:

-(void)startRead {
   [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(startRead) userInfo:nil repeats:YES];
   [asyncSocket readDataWithTimeout:-1 tag:0];
}

有了这个,我可以以 1 秒的间隔读取数据,但如果我尝试设置 0.1 秒,我的程序会冻结。(与 1 秒以下的值相同)我确信我在这里做错了,会有一种方法来实现我想要的,所以如果有人知道请帮忙!!谢谢

4

1 回答 1

0

我相信上面的评论是正确的,你没有在 init 上正确设置 Delegate。套接字创建应该是这样的

GCDAsyncUdpSocket* udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    NSError *error = nil;

    if (![udpSocket bindToPort:0 error:&error])
    {
        [self logError:[NSString stringWithFormat:@"Error binding: %@", error]];
        return;
    }
    if (![udpSocket beginReceiving:&error])
    {
        [self logError:[NSString stringWithFormat:@"Error receiving: %@", error]];
        return;
    }

    NSString *_host = nil;
    uint16_t _port = 0;
    [GCDAsyncUdpSocket getHost:&_host port:&_port fromAddress:udpSocket.localAddress];
    [self logInfo:[NSString stringWithFormat:@"Socket setup on host %@:%d", _host, _port]];

    [self logInfo:@"Socket created successfully."];

除非您使用的 GCDAsyncUdpSocket 版本与我熟悉的不同,否则正确的回调方法实际上是下面的方法。当设置了委托并且在正确的端口上接收到数据包时,它会自动调用。

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext
于 2013-09-06T13:20:15.427 回答