c_cpp 如何在Objective-C中打开TCP套接字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 如何在Objective-C中打开TCP套接字相关的知识,希望对你有一定的参考价值。

#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;
}
#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
#import <Foundation/Foundation.h>

@interface Communicator : NSObject <NSStreamDelegate> {
	@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

以上是关于c_cpp 如何在Objective-C中打开TCP套接字的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp Singleton(Objective-C with ARC)

c_cpp objective-c中多部分表单帖子的示例

c_cpp Objective-C代码,用于AES-128加密的加密和解密。

c_cpp Objective-C Enum-TO-NSString,反之亦然。

c_cpp 在编译时禁止使用默认的Objective-C -init方法(并提供一个其他超类方法的示例,您可以使用它

c_cpp Objective-C类将十六进制字符串转换为UIColor。支持#RGB#ARGB #RRGGBB #AARRGGBBUsage:[UIColor colorWithHexString: