· 编程思想 · 2 min read
Objective-C TCP通讯实例

{% codeblock Communicator.h lang:objc%} #import <Foundation/Foundation.h>
@interface Communicator : NSObject
@public
NSString *host;
int port;
}
- (void)setup;
- (void)open;
- (void)close;
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)event;
- (void)readIn:(NSString *)s;
- (void)writeOut:(NSString *)s;
@end {% endcodeblock %}
{% codeblock Communicator.m lang:objc%} #import “Communicator.h”
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
NSInputStream *inputStream;
NSOutputStream *outputStream;
@implementation Communicator
(void)setup {
NSURL *url = [NSURL URLWithString:host]; NSLog(@“Setting up connection to %@ : %i”, [url absoluteString], port);CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef)[url host], port, &readStream, &writeStream); if(!CFWriteStreamOpen(writeStream)) { NSLog(@"Error, writeStream not open"); return; } [self open]; NSLog(@"Status of outputStream: %i", [outputStream streamStatus]); return;}
(void)open {
NSLog(@“Opening streams.”); inputStream = (NSInputStream *)readStream; outputStream = (NSOutputStream *)writeStream;[inputStream retain]; [outputStream retain]; [inputStream setDelegate:self]; [outputStream setDelegate:self]; [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [inputStream open]; [outputStream open];}
(void)close {
NSLog(@“Closing streams.”); [inputStream close]; [outputStream close];[inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [inputStream setDelegate:nil]; [outputStream setDelegate:nil]; [inputStream release]; [outputStream release]; inputStream = nil; outputStream = nil;}
(void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)event {
NSLog(@“Stream triggered.”); switch(event) { case NSStreamEventHasSpaceAvailable: { if(stream == outputStream) { NSLog(@“outputStream is ready.”); } break; } case NSStreamEventHasBytesAvailable: { if(stream == inputStream) { NSLog(@“inputStream is ready.”);uint8_t buf[1024]; unsigned int len = 0; len = [inputStream read:buf maxLength:1024]; if(len > 0) { NSMutableData* data=[[NSMutableData alloc] initWithLength:0]; [data appendBytes: (const void *)buf length:len]; NSString *s = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; [self readIn:s]; [data release]; } } break; } default: { NSLog(@"Stream is sending an Event: %i", event); break; } }}
(void)readIn:(NSString *)s {
NSLog(@“Reading in the following:”);
NSLog(@”%@”, s);
}(void)writeOut:(NSString *)s {
uint8_t *buf = (uint8_t *)[s UTF8String]; [outputStream write:buf maxLength:strlen((char *)buf)];NSLog(@"Writing out the following:"); NSLog(@"%@", s);}
@end {% endcodeblock %}
{% codeblock StreamExample.m lang:objc%} #import <Foundation/Foundation.h>
#import “Communicator.h”
int main (int argc, const char _ argv[]) {
NSAutoreleasePool _ pool = [[NSAutoreleasePool alloc] init];
Communicator *c = [[Communicator alloc] init];
c->host = @"http://127.0.0.1";
c->port = 6789;
[c setup];
[c open];
[pool drain];
return 0;
}
{% endcodeblock %}



