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 は「Fail」を吐き出します。
間違っている場合は訂正してください。ただし、サーバーから読み取ったデータの値を「msg」に含めるべきではありませんか? Data Read は、データ長が 8 であることを期待していることを認識しているように見えますが、データが文字列に格納されていないようです。私はiOS、特にソケットプログラミングに非常に慣れていないため、これはすべて初めてです。この件に関するヘルプは大歓迎です。
ありがとう!