0

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、特にソケットプログラミングに非常に慣れていないため、これはすべて初めてです。この件に関するヘルプは大歓迎です。

ありがとう!

4

1 に答える 1

1

サーバーはUTF-8でエンコードされていないデータを配信していると思います。
してみてください

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

次の行を削除します。NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];

これで問題が解決しない場合は、次のエンコーディングを試してみてください。

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-08T18:04:33.397 に答える