【问题标题】:CocoaAsyncSockets seems to be failing when calling onSocket:didReadData:withTag调用 onSocket:didReadData:withTag 时 CocoaAsyncSockets 似乎失败了
【发布时间】:2012-06-08 17:32:26
【问题描述】:

由于某种原因,当我尝试调用 CocoaAsyncSocket 的 onSocket:didReadData:withTag 方法时,它失败并且不显示读取的数据。

appDelegate:

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

    [socket readDataWithTimeout:10 tag:1];

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

这是我在 CocoaAsyncSocket 库中的方法:

- (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];
    NSLog(@"RX length: %d", [data length]);
    if(msg)
    {
        NSLog(@"RX:%@",msg);
    }
    else 
    {
        NSLog(@"Fail");
    }    
}

- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err
{
    NSLog(@"error - disconnecting");
    //start reconnecting procedure here...
}

- (void)onSocketDidDisconnect:(AsyncSocket *)sock
{
    NSLog(@"disconnected");
}

- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
    NSLog(@"connected");
}

当我在模拟器中运行我的应用程序时,我的输出日志是这样输出的:

2012-06-08 13:17:30.808 tekMatrix[2793:f803] connected
2012-06-08 13:17:30.815 tekMatrix[2793:f803] RX length: 8
2012-06-08 13:17:30.816 tekMatrix[2793:f803] Fail
  • onSocket:didConnectToHost:port 被调用,NSLog 吐出“已连接”。
  • onSocket:didReadData:withTag 被调用,NSLog 吐出“RX length: 8”。
  • 同样在 onSocket:didReadData:withTag 中,NSLog 吐出“失败”。

如果我错了,请纠正我,但“msg”不应该包含从服务器读取的数据的值?看起来 Data Read 知道它期望的数据长度为 8,但数据似乎没有存储到字符串中。我对 iOS 非常陌生,尤其是套接字编程,所以这对我来说是全新的。对此主题的任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 我不知道,你的服务器应该做什么,但你不需要向它发送一些东西吗?
  • 服务器(由其他人编写)正在等待连接。一旦建立连接,就会向客户端发送一个值(我相信它是一个长类型)。我正在尝试获取 long 类型的值并将其放入字符串中。
  • 这对我来说没有多大意义: NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];你想要一个 NSData 对象的子数据,它是原始数据的整个长度吗?我认为您可以省略那行...
  • 你确定,数据是 UTF-8 编码的吗?
  • 我不肯定数据是 UTF-8 编码的。另一个人开发了服务器端应用程序,他今天没有空。如果数据不是 UTF-8 编码的,那么我猜它会失败,对吧?如果是这样的话,我将不得不搁置几天,直到我知道为止。再次感谢您的快速回复!

标签: iphone objective-c ios cocoaasyncsocket


【解决方案1】:

我相信,服务器正在传送不是 UTF-8 编码的数据。
请尝试

NSString *msg = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

并删除此行:NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];

如果这没有帮助,here are some more encodings 试试:

enum {
   NSASCIIStringEncoding = 1,
   NSNEXTSTEPStringEncoding = 2,
   NSJapaneseEUCStringEncoding = 3,
   NSUTF8StringEncoding = 4,
   NSISOLatin1StringEncoding = 5,
   NSSymbolStringEncoding = 6,
   NSNonLossyASCIIStringEncoding = 7,
   NSShiftJISStringEncoding = 8,
   NSISOLatin2StringEncoding = 9,
   NSUnicodeStringEncoding = 10,
   NSWindowsCP1251StringEncoding = 11,
   NSWindowsCP1252StringEncoding = 12,
   NSWindowsCP1253StringEncoding = 13,
   NSWindowsCP1254StringEncoding = 14,
   NSWindowsCP1250StringEncoding = 15,
   NSISO2022JPStringEncoding = 21,
   NSMacOSRomanStringEncoding = 30,
   NSUTF16StringEncoding = NSUnicodeStringEncoding,
   NSUTF16BigEndianStringEncoding = 0x90000100,
   NSUTF16LittleEndianStringEncoding = 0x94000100,
   NSUTF32StringEncoding = 0x8c000100,
   NSUTF32BigEndianStringEncoding = 0x98000100,
   NSUTF32LittleEndianStringEncoding = 0x9c000100,
   NSProprietaryStringEncoding = 65536
};

NSISOLatin1StringEncoding 也很常见。

【讨论】:

  • 看来我离解决这个问题越来越近了!我对代码进行了更改以反映您的代码更改建议,现在我得到“2012-06-08 14:05:38.215 tekMatrix[3072:f803] RX:”,“RX:”后面有一个倒置的问号。感谢所有的帮助。你是一个非常高质量的 SO 用户 :)
  • 我删除了“NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];”它导致我的应用程序完全崩溃。我把那条线放回去,这样它就不会崩溃了。
  • 是的,我替换了“NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];”用“NSString *msg = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];”它导致应用程序崩溃。现在我保留了两行代码以防止应用程序崩溃。为什么消除 strData 行代码很重要?
  • 您实际上是在创建第一个数据对象的副本。这应该是不必要的。
  • 奇怪,它现在似乎可以正常工作了。我正在修改删除/添加代码。也许我第一次打错字了。我正在取得进展,但现在应用程序在调用所有方法后“挂起”。我对此提出了一个新问题,因为我很困惑为什么会这样。感谢所有的帮助......再次:D
猜你喜欢
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 2021-01-25
  • 2014-12-31
  • 1970-01-01
相关资源
最近更新 更多