首先用CFStreamCreamPairWithSocketToHost获取CFReadStreamRef和CFWriteStream
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"localhost", 80, &readStream, &writeStream);
然后将CFReadStreamRef和CFWriteStreamRef转换为NSInputStream和NSOutputStream
self.inputStream = (__bridge NSInputStream *)readStream;
self.outputStream = (__bridge NSOutputStream *)writeStream;
再为NSInputStream和NSOutputStream设置代理,线程,调用open
[self.inputStream setDelegate:self];
[self.outputStream setDelegate:self];
[self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.inputStream open];
[self.outputStream open];
接下来就可以在NSOutputStream里面写入了
NSString *response = [NSString stringWithFormat:@"iam:%@",self.inputNameField.text];
NSData *data = [[NSData alloc]initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
[self.outputStream write:[data bytes] maxLength:[data length]];
最后再设置下代理的实现方法
-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{
NSLog(@"stream event");
switch (eventCode) {
case NSStreamEventOpenCompleted:
NSLog(@"Stream opened");
break;
case NSStreamEventHasBytesAvailable:
if(aStream == self.inputStream){
uint8_t buffer[1024];
int len;
while ([self.inputStream hasBytesAvailable]) {
len = (int)[self.inputStream read:buffer maxLength:sizeof(buffer)];
if(len > 0){
NSString *output = [[NSString alloc]initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
if(output != nil){
NSLog(@"server said: %@",output);
[self messageReceived:output];
}
}
}
}
break;
case NSStreamEventErrorOccurred:
NSLog(@"Can not connect to the host!");
break;
case NSStreamEventEndEncountered:
[aStream close];
[aStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
break;
default:
NSLog(@"Unknown event");
break;
}
}
-(void)messageReceived:(NSString *)message{
[self.messages addObject:message];
}