私はこの問題で数日間立ち往生しており、解決に近づいているようです (優れたユーザー @ SO の助けを借りて)。CocoaAsyncSocket ライブラリを使用して、Windows サーバーへの TCP ソケット接続を作成しています。
接続は私の appDelegate で行われています:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
socket = [[AsyncSocket alloc] initWithDelegate:self];
NSError *error = nil;
if (![socket connectToHost:@"199.5.83.63" onPort:11005 error:&error])
{
NSLog(@"Error connecting: %@", error);
}
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;
}
onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port: という接続メソッド (ライブラリの一部) があります。
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
NSLog(@"connected :D");
}
NSLOG からの出力を確認でき、正常に接続されているため、このメソッドが呼び出されています。また、Windows マシンから (ログ ファイルを使用して) 接続が成功していることも確認できます。
別のデリゲート メソッドも呼び出されていることもテストしました。
- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err
{
NSLog(@"error - disconnecting");
// start reconnecting procedure here...
}
シミュレーターでアプリを実行し、ラップトップからイーサネット コードを抜いて、 willDisconnectWithError メソッドが機能することをテストしました。これを行うと、出力に「エラー - 切断中」という文字列が表示されました。
ただし、大きな問題は、デリゲート メソッド (これもライブラリから) が呼び出されていないことです。
委任メソッドが呼び出されていません:
- (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];
if(msg)
{
NSLog(@"RX:%@",msg);
}
else
{
NSLog(@"Fail");
}
}
デリゲート メソッドがどのように機能するかについての知識と理解には自信がありますが、どのようにデリゲート メソッドが呼び出されるかについてはまだ完全には理解できていません。さらに複雑で混乱を招くのは、1 つのデリゲート メソッド (onSocket: didConnectToHost ポート :) が呼び出されていますが、もう 1 つのデリゲート メソッド (onSocket: didReadData タグ :) が呼び出されていないことです。残念ながら、これは私の問題のステップ 1 に過ぎませんが、他の問題に進む前に、この問題を解決する必要があります。
どんな助けでも大歓迎です。ありがとう