Ios 通过NSStream确定成功建立连接和断开连接
我正在尝试为Ios 通过NSStream确定成功建立连接和断开连接,ios,macos,sockets,foundation,cfnetwork,Ios,Macos,Sockets,Foundation,Cfnetwork,我正在尝试为NSStream编写类似于包装器的东西,以使我的生活更轻松。我只想知道什么时候建立连接,什么时候关闭,写一些数据,获取接收到的数据。所以我在想这样的事情: 标题: @interface StreamWrapper : NSObject - (id)initWithDelegate:(id <StreamWrapperDelegate>)delegate; - (void)writeData:(NSData *)data; @end @protocol StreamW
NSStream
编写类似于包装器的东西,以使我的生活更轻松。我只想知道什么时候建立连接,什么时候关闭,写一些数据,获取接收到的数据。所以我在想这样的事情:
标题:
@interface StreamWrapper : NSObject
- (id)initWithDelegate:(id <StreamWrapperDelegate>)delegate;
- (void)writeData:(NSData *)data;
@end
@protocol StreamWrapperDelegate <NSObject>
@required
- (void)streamWrapper:(StreamWrapper *)streamWrapper didReceiveData:(NSData *)data;
- (void)streamWrapperDidConnect:(StreamWrapper *)streamWrapper;
- (void)streamWrapperDidCloseConnection:(StreamWrapper *)streamWrapper;
@end
@接口流包装器:NSObject
-(id)initWithDelegate:(id)delegate;
-(无效)写入数据:(NSData*)数据;
@结束
@协议StreamWrapperDelegate
@必需的
-(void)streamWrapper:(streamWrapper*)streamWrapper didReceiveData:(NSData*)数据;
-(void)streamWrapperDidConnect:(StreamWrapper*)StreamWrapper;
-(void)streamWrapperDidCloseConnection:(StreamWrapper*)StreamWrapper;
@结束
类别:
@interface StreamWrapper () <NSStreamDelegate>
...
@property (nonatomic, weak) id <StreamWrapperDelegate> delegate;
@property (nonatomic, strong) NSInputStream *inputStream;
@property (nonatomic, strong) NSOutputStream *outputStream;
- (void)closeStreams;
- (void)setAndOpenStreams;
@end
@implementation StreamWrapper
#pragma mark - NSStreamDelegate
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
switch (eventCode) {
case NSStreamEventEndEncountered:
// Should I here close both streams (even if this is called only for one (in or out)) and delegate closed connection?
break;
case NSStreamEventErrorOccurred:
// Should I here close both streams (even if this is called only for one (in or out)) and delegate closed connection?
break;
case NSStreamEventHasBytesAvailable:
// My reading algorithm...
[self.delegate streamWrapper:self didReceiveData:data];
break;
case NSStreamEventHasSpaceAvailable:
// Is this useful for me?
break;
case NSStreamEventNone:
// Is this useful for me?
break;
case NSStreamEventOpenCompleted:
// Should I here delegate successful connection? Should I wait to receive this for both streams? How?
break;
default:
break;
}
}
...
@end
@接口流包装器()
...
@属性(非原子,弱)id委托;
@属性(非原子,强)NSInputStream*inputStream;
@属性(非原子,强)NSOutputStream*outputStream;
-(无效)封闭溪流;
-(无效)setAndOpenStreams;
@结束
@实现流包装器
#pragma标记-NSStreamDelegate
-(void)流:(NSStream*)aStream handleEvent:(NSStreamEvent)事件代码
{
开关(事件代码){
案件被驳回:
//在这里,我是否应该关闭两个流(即使只为一个流(in或out)调用),并委托关闭的连接?
打破
发生错误的案例:
//在这里,我是否应该关闭两个流(即使只为一个流(in或out)调用),并委托关闭的连接?
打破
案例NSTRAVENTHASBYTES可用:
//我的阅读算法。。。
[self.delegate streamWrapper:self-didReceiveData:data];
打破
案例NSSTREATEVENTHASSPACE可用:
//这对我有用吗?
打破
案例1:文通:
//这对我有用吗?
打破
已完成的案例:
//我应该在这里委托成功的连接吗?我应该等待接收这两个流吗?如何?
打破
违约:
打破
}
}
...
@结束
所以。。。如何实现这一点,我将始终知道何时建立连接,我能够发送和接收数据,何时连接断开(即使只有一种方式),我应该关闭它并尝试全新的建立?或者,做这样的事情的正确方法是什么?根据
- 有关更多信息,请参阅本文:
我以前使用NSStream的经验是捕获第一个NSStreamVenthassspaceAvailable事件作为建立连接的信号
当出现错误或消息已完成时,我也会将输入流和输出流置为零,因此我只需要在writeData:方法中检查这些流是否为零。我讨厌这种回答,但在这种情况下,这是我应得的。如果这不能解决您的问题,我可以为您提供一个示例源代码。我正在做的那件事好吧,我想现在我能做了,但如果可能的话,我也想看看你的解决方案。
NSStreamEventNone
No event has occurred.
Available in OS X v10.3 and later.
Declared in NSStream.h.
NSStreamEventOpenCompleted
The open has completed successfully.
Available in OS X v10.3 and later.
Declared in NSStream.h.
NSStreamEventHasBytesAvailable
The stream has bytes to be read.
Available in OS X v10.3 and later.
Declared in NSStream.h.
NSStreamEventHasSpaceAvailable
The stream can accept bytes for writing.
Available in OS X v10.3 and later.
Declared in NSStream.h.
NSStreamEventErrorOccurred
An error has occurred on the stream.
Available in OS X v10.3 and later.
Declared in NSStream.h.
NSStreamEventEndEncountered
The end of the stream has been reached.
Available in OS X v10.3 and later.
Declared in NSStream.h.