ios开发中 socket编程 根据使用库的不同有不同方式, 比如BSD socket,CFSocket都可以创建socket, CFStream对CFSocket进行了封装,把读写流与socket进行了绑定。这些API都是C的库。但是CFReadStream和CFWriteStream可以转换为object-c中的NSInputStream, NSOutputStream。然后就可以利用NSStream的delegate进行读写操作。
首先可以用创建与socket进行了绑定的CFStream,可以用多种方式创建,比如host,NetService,Native socket 也可以用FTP/http url, HTTPRequest等
CFStreamCreatePairWithSocket
CFStreamCreatePairWithSocketToHost
CFStreamCreatePairWithSocketToNetService
CFReadStreamCreateForHTTPRequest
CFReadStreamCreateWithFTPURL
有了CFStream,可以这样进行转换:
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
NSInputStream *inputStreamPtr = CFBridgingRelease(readStream);
NSOutputStream *outputStreamPtr = CFBridgingRelease(writeStream);
有了NSStream, 然后设置delegate, schedule到runloop中去,再open:
self.networkStream.delegate = self;
[self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.networkStream open];
最后就是实现NSStreamDelegate的函数:
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode;
然后在函数内部根据不同的event进行操作:
NSStreamEventHasBytesAvailable表示有数据可读。
NSStreamEventHasSpaceAvailable表示可以写数据。