Iphone CocoaAsyncSockets在调用Socket:didReadData:withTag时似乎失败
出于某种原因,当我尝试调用CocoaAsyncSocket的onSocket:didReadData:withTag方法时,它失败了,并且没有显示读取的数据 appDelegate: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
- (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”
谢谢 我相信,服务器正在传送数据,这些数据不是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
};