Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone CocoaAsyncSockets在调用Socket:didReadData:withTag时似乎失败_Iphone_Objective C_Ios_Cocoaasyncsocket - Fatal编程技术网

Iphone CocoaAsyncSockets在调用Socket:didReadData:withTag时似乎失败

Iphone CocoaAsyncSockets在调用Socket:didReadData:withTag时似乎失败,iphone,objective-c,ios,cocoaasyncsocket,Iphone,Objective C,Ios,Cocoaasyncsocket,出于某种原因,当我尝试调用CocoaAsyncSocket的onSocket:didReadData:withTag方法时,它失败了,并且没有显示读取的数据 appDelegate: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSError *error = nil; if (![socket c

出于某种原因,当我尝试调用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长度:8”
  • 同样在onSocket:didReadData:withTag中,NSLog吐出“Fail”
如果我错了,请纠正我,但它不应该“msg”包含从服务器读取的数据的值?看起来读取的数据知道它期望数据长度为8,但数据似乎没有存储到字符串中。我对iOS非常陌生,尤其是socket编程,所以这对我来说是全新的。在此问题上的任何帮助都将不胜感激


谢谢

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

NSString *msg = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
并删除此行:
NSData*strData=[data subdataWithRange:NSMakeRange(0,[data length])

如果这没有帮助,请尝试:


NSISOLatin1StringEncoding
也很常见。

我不知道你的服务器应该做什么,但是你不需要发送一些东西给它吗?服务器(由其他人编写)正在等待连接。一旦建立了连接,就会向客户端发送一个值(我相信它是一个长类型)。我试图获取long类型的值并将其放入字符串中。这对我来说没有太大意义:NSData*strData=[data subdataWithRange:NSMakeRange(0,[data length]);是否希望NSData对象的子数据是原始数据的整个长度?我想你可以省略这一行…你确定,数据是UTF-8编码的吗?我不能肯定数据是UTF-8编码的。另一个人开发了服务器端应用程序,他今天不在。如果数据不是UTF-8编码的,那么我猜它会失败,对吗?如果是这样的话,我将不得不把这件事搁置几天,直到我知道。再次感谢您的快速回复!看来我离解决这个问题越来越近了!我对代码进行了更改以反映您的代码更改建议,现在我得到了“2012-06-08 14:05:38.215 tekMatrix[3072:f803]RX:”,在“RX:”后面有一个颠倒的问号。谢谢你的帮助。您的质量非常高,所以用户:)我删除了“NSData*strData=[data subdataWithRange:NSMakeRange(0,[data length])”,这导致我的应用程序完全崩溃。我将该行放回原处,这样它就不会崩溃。是的,我将“NSData*strData=[数据子数据WithRange:NSMakeRange(0,[数据长度])];”替换为“NSString*msg=[[NSString alloc]initWithData:data encoding:NSASCIIStringEncoding];”并导致应用程序崩溃。现在我保留了两行代码,以防止应用程序崩溃。为什么消除代码的strData行很重要?实际上您正在创建第一个数据对象的副本。这应该是不必要的。奇怪的是,它现在似乎工作正常。我正在修改删除/添加代码。也许我第一次打错了什么的。我正在取得进展,但在调用所有方法后,应用程序现在处于“挂起”状态。我提出了一个新的问题,因为我不明白为什么会发生这种事。谢谢你的帮助。。。再说一遍:D
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
};