0

我使用 CocoaAsyncSocket 创建了一个 TCP 套接字连接,每当我尝试执行 didReadData 时,我都会返回空白。当我设置断点并尝试调试时,我发现“msg”的值是@“”。

这就是我的 appDelegate.m 的样子:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSData *data = nil;
    // Initialize socket object and make it a delegate.  Then call the delegate methods.
    socket = [[AsyncSocket alloc] initWithDelegate:self];
    [self connect];
    [self onSocket:socket didConnectToHost:@"9.5.8.6" port:11005];
    [self onSocket:socket didReadData:data withTag:1]; // tags COULD be #defined *******

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[tekMatrixViewController alloc]  initWithNibName:@"tekMatrixViewController" bundle:nil] autorelease];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

这是我的 onSocket:socket didReadData:data withTag: 方法:

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];
    NSString *msg = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];
    if(msg)
    {
        NSLog(@"RX:%@",msg);
        if(msg == nil)
        {
            NSLog(@"msg is all Blanks");
        }
    } 
    else 
    {
        NSLog(@"Fail");
    }    
}

请注意,此方法是来自 CocoaAsyncLibrary 的方法。我不知道我是否正确调用了该方法,或者我是否没有传递正确的参数,或者什么。

当我运行该应用程序时,我在控制台中看到的只是:

2012-06-06 11:44:00.434 tekMatrix[1378:f803] connected
2012-06-06 11:45:14.312 tekMatrix[1378:f803] RX:

非常感谢任何和所有帮助。

谢谢!

编辑

这是我现在的 didFinishLaunchingWithOptions 方法中的内容:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    socket = [[AsyncSocket alloc] initWithDelegate:self];
    NSError *error = nil;
    if (![socket connectToHost:@"199.5.83.63" onPort:11005 error:&error]) 
    {
        NSLog(@"Error connecting: %@", error);
    }

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[tekMatrixViewController alloc] initWithNibName:@"tekMatrixViewController" bundle:nil] autorelease];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

现在我可以看到我已连接,但我仍然不理解 onSocket:socket didReadData:data withTag: 方法未被调用。对此的任何帮助将不胜感激。谢谢!

4

1 回答 1

3

对不起,我不得不说:你把代表弄错了。

你不会调用你实现的方法来自己实现委托的协议——委托者(在这种情况下是套接字)会这样做

所以这段代码

[self connect];
[self onSocket:socket didConnectToHost:@"9.5.8.6" port:11005];
[self onSocket:socket didReadData:data withTag:1]

根本没有任何意义。删除它。

相反,应该有如下代码来连接

NSError *error = nil;
if (![socket connectToHost:@"9.5.8.6" onPort:11005 error:&error]) {
    NSLog(@"Error connecting: %@", error);
}

然后,套接字将调用socket:didConnectToHost:port:,这可能看起来像

-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
        [sock writeData:self.data withTimeout:-1 tag:1];

}

并且对象套接字将调用您提供的进一步委托方法实现。


但是由于委托是可可(-touch)中一种非常重要的模式,请确保您做对了。

于 2012-06-06T19:39:13.740 回答