原因出在這個方法:[self.clientSocket readDataWithTimeout:-1 tag:0];
在連接成功的代理中:
//連接成功
-(void)socket:(GCDAsyncSocket*)sockdidConnectToHost:(NSString*)hostport:(uint16_t)port {
? ? NSLog(@"--連接成功--");
//必須加這個方法
? ? [self.clientSocket readDataWithTimeout:-1 tag:0];
}
在收到消息的代理中:
//收到的消息
-(void)socket:(GCDAsyncSocket*)sockdidReadData:(NSData*)datawithTag:(long)tag {//也必須調(diào)用這個方法
? ? [self.clientSocket readDataWithTimeout:-1 tag:0];
//數(shù)據(jù)格式轉(zhuǎn)換
? ? NSString*recvStr;
? ? if(data) {
? ? ? ? recvStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
? ? }
? ? NSLog(@"%@",recvStr);
}
完整的代碼
#import?<GCDAsyncSocket.h>
@interface MYSocketHelper () < GCDAsyncSocketDelegate>
@property (nonatomic, strong) GCDAsyncSocket *clientSocket;
@end
-(void)asynSocketInit {
? ? self.clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
? ? NSError*err =nil;
? ? if (![self.clientSocket connectToHost:@"127.0.0.1" onPort: 60000 error:&err])? ?{
? ? ? ? NSLog(@"I goofed: %@", err);
? ? }?else?{
? ? ? ? [self.clientSocket writeData:[@"xxxx" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
? ? }
}
-(void)socket:(GCDAsyncSocket*)sockdidConnectToHost:(NSString*)hostport:(uint16_t)port {
? ? NSLog(@"--連接成功--");
? ? [self.clientSocket readDataWithTimeout:-1 tag:0];
}
-(void)socket:(GCDAsyncSocket*)sockdidReadData:(NSData*)datawithTag:(long)tag {
? ? [self.clientSocket readDataWithTimeout:-1 tag:0];
? ? NSString*recvStr;
? ? if(data) {
? ? ? ? recvStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
? ? }
? ? NSLog(@"%@",recvStr);
}
- (void)socket:(GCDAsyncSocket*)sockdidReadPartialDataOfLength:(NSUInteger)partialLengthtag:(long)tag {
}
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {
}
自測的話可以下載一個ssokit,模擬了socket服務端,能收發(fā)消息

地址:127.0.0.1本機的地址,端口范圍 1024~65535。