2012-07-23 39 views
0

我是客观的C和ios开发的新手。我通常使用Java对Android应用程序进行编程,并始终使用onPause调用来关闭套接字。但是,当我在applicationWillResignActive下调用我的close socket方法时,我与我的流监听器失去了通信,无法关闭输入和输出流。实际上,即使应用连接到服务器,流的流状态也显示NSStreamStatusNotOpen或0。有任何想法吗?当应用程序转到后台时关闭NSStreams

谢谢

编辑

连接方法SocketHandler.m类:

-(void)connect:(int *)port ipAddress:(NSString *)ipAddress 
{ 
     CFReadStreamRef readStream; 
     CFWriteStreamRef writeStream; 
     CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)ipAddress, port, &readStream, &writeStream); 
     inputStream = (NSInputStream *)readStream; 
     outputStream = (NSOutputStream *)writeStream; 
     [inputStream setDelegate:self]; 
     [outputStream setDelegate:self]; 
     [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     [inputStream open]; 
     [outputStream open]; 
     NSLog(@"input stream id %i", inputStream); 
} 

-(void)disconnect{ 

    NSLog(@"disconnect method called"); 

    socketStatus = [outputStream streamStatus]; 
    int status = socketStatus; 
    NSLog(@"Stream Status is %i", status); 

    if (status == 2) { 
     [inputStream close]; 
     [outputStream close]; 
     NSLog(@"Socket Closed"); 
    } 



} 
+0

能否详细说明一下?调用发送'close:'到'NSStream'应该关闭它,并且发送你的委托'stream:handleEvent:'。 – arbales 2012-07-23 20:11:12

+0

我相信问题是无法从我的AppDelegate访问NSInputStream和NSOutputStream对象。我有一个名为SocketHandler的类,它有一个连接和断开方法。我从UI中的按钮调用连接和断开方法。然而,当我从应用程序中调用断开连接方法将会在应用程序代理中激活时,它就像不能访问更为奇怪的流对象,因为应用程序中的每个其他类都可以。 – 2012-07-23 21:22:15

+0

您是如何创建连接到按钮的SocketHandler对象的?你如何从应用程序委托中发现这个对象? – 2012-07-23 21:55:36

回答

0

好吧,这里的答案是我自己的问题。

我创建了3类:

TCPSocketAppDelegate TCPSocketViewController 插槽处理器

里面的套接字句柄类我有一个名为Connect和另一个叫断开一个方法。在这里,他们是:

连接方法:

-(void)connect:(int *)port ipAddress:(NSString *)ipAddress 
{ 
     NSLog(@"input stream id %i", inputStream); 
     CFReadStreamRef readStream; 
     CFWriteStreamRef writeStream; 
     CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)ipAddress, port, &readStream, &writeStream); 
     inputStream = (NSInputStream *)readStream; 
     outputStream = (NSOutputStream *)writeStream; 
     [inputStream setDelegate:self]; 
     [outputStream setDelegate:self]; 
     [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     [inputStream open]; 
     [outputStream open]; 
     NSLog(@"input stream id %i", inputStream); 
} 

断开方法:

-(void)disconnect{ 

    NSLog(@"disconnect method called"); 
    NSLog(@"input stream id %i", inputStream); 

    socketStatus = [outputStream streamStatus]; 
    int status = socketStatus; 
    NSLog(@"Stream Status is %i", status); 

    if (status == 2) { 
     [inputStream close]; 
     [outputStream close]; 
     NSLog(@"Socket Closed"); 
    } 



} 

然后我创建的参考对象在TCPSocketAppDelegate类的Socket处理器类和TCPSocketView Controller类。但是,当我这样做时,它为每个类创建了一个SocketHandler类的新实例,所以它们不是寻址同一个套接字,因此可以连接套接字,但另一个无法访问它。为了弥补这一点,我简单地使用+(void)在全局访问连接和断开方法。现在我不必在其他类中创建一个引用对象来调用这些方法。我希望这些信息能帮助一些人。

相关问题