1

私はこの問題で数日間立ち往生しており、解決に近づいているようです (優れたユーザー @ 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 に過ぎませんが、他の問題に進む前に、この問題を解決する必要があります。

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

5

AsyncSocket.hファイルから:

/**
 * Called when a socket has completed reading the requested data into memory.
 * Not called if there is an error.
**/
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;

私の最初の推測では、エラーが発生しているため、デリゲートメソッドが呼び出されていません。エラーを処理するためのデリゲートメソッドも実装しましたか?

/**
 * In the event of an error, the socket is closed.
 * You may call "unreadData" during this call-back to get the last bit of data off the socket.
 * When connecting, this delegate method may be called
 * before"onSocket:didAcceptNewSocket:" or "onSocket:didConnectToHost:".
**/
- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;

注:エラーなしで接続できるからといって、エラーが発生せずに読み取ることができるという意味ではありません。渡すエラー引数は、connectToHost:onPort:error:すべてのエラー条件を網羅しているわけではありません。

編集:ソケットで「readData」メソッドの1つを呼び出すコードの部分を投稿できますか?そこに見落とされていることがあるかもしれません。たとえば、「readData」メッセージがソケットに送信されていない場合は、デリゲートメソッドが呼び出されていない理由を説明します。

編集:このonSocket:didReadData:withTag:メソッドは、ソケットで次のreadDataメソッドのいずれかを呼び出した後にのみ呼び出されます。例えば:

// The readData and writeData methods won't block (they are asynchronous).
// 
// When a read is complete the onSocket:didReadData:withTag: delegate method is called.
// When a write is complete the onSocket:didWriteDataWithTag: delegate method is called.
// 
// You may optionally set a timeout for any read/write operation. (To not timeout, use a negative time interval.)
// If a read/write opertion times out, the corresponding "onSocket:shouldTimeout..." delegate method
// is called to optionally allow you to extend the timeout.
// Upon a timeout, the "onSocket:willDisconnectWithError:" method is called, followed by "onSocketDidDisconnect".
// 
// The tag is for your convenience.
// You can use it as an array index, step number, state id, pointer, etc.

/**
 * Reads the first available bytes that become available on the socket.
 * 
 * If the timeout value is negative, the read operation will not use a timeout.
**/
- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag;
于 2012-06-07T19:41:18.247 に答える