The GCDAsynSocketDelegate didReadData method is not called. Using GCDAsynSocket

I am trying to just send and receive a message using GCDAsyncSocket and cannot make it work.

I successfully establish a connection and write messages, but when it comes to reading, my delegate is never called.

I am using ios5 and this setting:

Client:

-(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); } } 

The delegated method didReadData is not called

 -(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{ NSLog(@"MESSAGE: %@", [NSString stringWithUTF8String:[data bytes]]); } 

Server

 -(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); } } 

Write a message to the client and wait for a response to a successful socket connection

 - (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]; } 

And this is not called ever ...

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

Ok, I found the answer.

The problem was that I was writing and reading on my own end of the socket instead of the connected socket.

Bugfix: (changed asyncSocket to 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]; } 
+3
source

Source: https://habr.com/ru/post/902999/


All Articles