Метод GCDAsynSocketDelegate didReadData не вызывается.Использование GCDAsynSocket - PullRequest
6 голосов
/ 03 декабря 2011

Я пытаюсь просто отправить и получить сообщение с помощью GCDAsyncSocket и не могу заставить его работать.

Я успешно устанавливаю соединение и пишу сообщения, но когда дело доходит до чтения, мой делегат никогда не вызывается.

Я использую ios5 и эту настройку:

Клиент:

-(void) connectToHost:(HostAddress*)host{

    NSLog(@"Trying to connect to host %@", host.hostname);

    if (asyncSocket == nil)
    {
        asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

        NSError *err = nil;
        if ([asyncSocket connectToHost:host.hostname onPort:host.port error:&err])
        {
            NSLog(@"Connected to %@", host.hostname);

            NSString *welcomMessage = @"Hello from the client\r\n";
            [asyncSocket writeData:[welcomMessage dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1];

            [asyncSocket readDataWithTimeout:-1 tag:0];
        }else
            NSLog(@"%@", err);
    }

}

Метод делегата didReadData не вызывается

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{

    NSLog(@"MESSAGE: %@", [NSString stringWithUTF8String:[data bytes]]);

}

Сервер

-(void)viewDidLoad{

    asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    connectedSockets = [[NSMutableArray alloc] init];

    NSError *err = nil;
    if ([asyncSocket acceptOnPort:0 error:&err]){

        UInt16 port = [asyncSocket localPort];

        //...bojour stuff
    }
    else{
        NSLog(@"Error in acceptOnPort:error: -> %@", err);
    }

}

Написать сообщение клиенту и дождаться ответа при успешном подключении к сокету

- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
    NSLog(@"Accepted new socket from %@:%hu", [newSocket connectedHost], [newSocket connectedPort]);

    // The newSocket automatically inherits its delegate & delegateQueue from its parent.

    [connectedSockets addObject:newSocket];

    NSString *welcomMessage = @"Hello from the server\r\n";
    [asyncSocket writeData:[welcomMessage dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1];

    [asyncSocket readDataWithTimeout:-1 tag:0];

}

И это не называется никогда ...

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
    NSLog(@"New message from client... ");
}

1 Ответ

3 голосов
/ 03 декабря 2011

Хорошо, нашел ответ.

Проблема заключалась в том, что я писал и читал на своем собственном сокете вместо подключенного сокета.

Исправлено: (изменено asyncSocket на newSocket)

- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
    NSLog(@"Accepted new socket from %@:%hu", [newSocket connectedHost], [newSocket connectedPort]);

    // The newSocket automatically inherits its delegate & delegateQueue from its parent.

    [connectedSockets addObject:newSocket];

    NSString *welcomMessage = @"Hello from the server\r\n";
    [newSocket writeData:[welcomMessage dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1];

    [newSocket readDataWithTimeout:-1 tag:0];

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...