1

IOSソケットプログラミングの助けが必要です。IOSとJavaサーバーの間に正常なTCPソケット接続を実装しましたが、ソケットに障害が発生した後は再接続できないことがわかりました(ネットワークを切断して再接続します)。

これは、ストリームを開くために使用するコードです。

- (void)initCommunication{
@try {
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"XXX.XXX.XXX.XXX", 4454, &readStream, &writeStream);

    inputStream = (__bridge NSInputStream *)readStream;
    outputStream = (__bridge NSOutputStream *)writeStream;

    //Asignamos los delegates
    inputStream.delegate = self;
    outputStream.delegate = self;  

    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

    [inputStream open];
    [outputStream open];
    connected = true;
    }
}
@catch (NSException *exception) {
    connected = false;
    NSLog(@"Error connecting socket: %@", exception.reason);
    [self checkConnection];
}
}

そして、NSStreamEventErrorOccurredまたはNSStreamEventEndEncounteredを受け取ったら、接続を閉じて再接続しようとします。

私はそれを次のように閉じます:

-(void) close{

[inputStream close];
[inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream close];
[outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream setDelegate:nil];
inputStream = nil;
[outputStream setDelegate:nil];
outputStream = nil;

connected = false;
}

問題は、ソケットが再接続されないことです...ソケットを再接続できるかどうかを確認するためにSmallSocketsまたはCocoaAsyncSocketsを使用することを考えています...実装上の問題がありますか?SmallSocketsまたはCocoaAsyncSocketsの使用をお勧めしますか?

前もって感謝します!!

4

1 に答える 1

3

最後に、CocoaAsyncSockets https://github.com/robbiehanson/CocoaAsyncSocketを使用して実装しましたが、このソケットを使用して再接続するのは非常に簡単でした。

まず、ソケットオブジェクトを初期化します。

socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

接続するには、次を使用します。

NSError *err = nil;
if ([socket connectToHost:@"XXX.XXX.XXX.XXX" onPort:YYYY error:&err])
{
NSLog(@"Connection performed!");
}
else
{
NSLog(@"Unable to connect: %@", err);
}

そして、デリゲートを使用して、失敗したときに再接続を行うことができます。

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
NSLog(@"Socket:DidConnectToHost: %@ Port: %hu", host, port);

connected = YES;
    [sock readDataWithTimeout:-1 tag:0];
}

- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
NSLog(@"SocketDidDisconnect:WithError: %@", err);   
    connected = NO;
    //We will try to reconnect
    [self checkConnection];
}

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    [self processReceivedData:data];
    [sock readDataWithTimeout:-1 tag:0];
}  

そのライブラリはとても使いやすいと思いました。それが誰にでも役立つことを願っています。どうもありがとう。

于 2012-05-29T11:15:10.383 に答える