2012-05-25 1 views
1

IOS 소켓 프로그래밍에 도움이 필요합니다. 나는 IOS와 자바 서버 사이의 성공적인 TCP 소켓 연결을 구현했다. 그러나 나는 소켓이 실패한 후에 다시 연결하는 것이 불가능하다는 것을 발견했다. (나는 나의 네트워크 연결을 끊고 다시 연결한다.)IOS에서 소켓 단절

나는 스트림을 여는 데 사용하는 코드입니다

:

- (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를 사용하여 생각하고 ... 다시 다시 연결되지 않는 것입니다 구현 문제가 있습니까? SmallSocket 또는 CocoaAsyncSockets를 사용 하시길 권장합니까 ??

미리 감사드립니다.

+1

다시 연결하면 어떤 오류가 발생합니까? 또한 서버가 제대로 듣고 있는지 확인하십시오 (예 : Mac에서 netcat으로 연결하고 연결을 끊은 다음 바로 다시 연결 할 수 있습니까?). – abarnert

+0

ARC를 사용하고있는 것 같습니다. – parselmouth

+0

예 ARC를 사용하고 있습니다. 그 이유는 내 코드에 릴리스가 없기 때문입니다 ... 그러나 서버 부분에서 모두 정상적으로 수신되므로 두 부분간에 패킷을 교환 할 수 있습니다. 문제가 발생하면 다시 연결할 때 문제가 발생합니다. 연결 해제를 강제로 ... 나는 다시 보낼 수는 있지만받을 수는 없었다. 내가받은 소켓 이벤트에 대한 더 많은 정보를 넣을 것입니다 ... – Kasas

답변

3

마지막으로 나는 CocoaAsyncSockets https://github.com/robbiehanson/CocoaAsyncSocket으로 구현했으며 실제로이 소켓으로 다시 연결하는 것이 쉬웠다. 그것은 실패 할 때마다 다시 연결을 할

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

을 그리고 당신이 대리자를 사용할 수 있습니다 :

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

내가 사용 연결하려면 :

- (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]; 
} 

먼저 나는 소켓 객체를 초기화

그 라이브러리를 사용하기가 매우 쉽습니다. 나는 그것이 누군가를 돕기를 바랍니다. 고마워요.

+0

위대한 프레임 워크,하지만 socketDidDisconnect는 iOS 6에서 호출하지 않는 것 같습니다 ... ( –

+0

죄송합니다, GCDAsyncSocket을 사용할 때 작동합니다. 대신 AsyncSocket을 사용하고 있습니다 ... –

+0

당신이 그것을 발견했기 때문에 다행), 다른 프레임 워크로 내 문제를 해결했습니다. – Kasas