【发布时间】: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