设为首页 加入收藏

TOP

Objective-C TCP 通讯实例
2014-11-24 08:29:39 来源: 作者: 【 】 浏览:0
Tags:Objective-C TCP 通讯 实例

TCP通讯实例


Communicator.h


#import

@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


Communicator.m


#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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇二叉搜索树(Binary Search Tree .. 下一篇httpd系统自带启动脚本详解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·MySQL 基础入门视频 (2025-12-26 23:20:22)
·小白入门:MySQL超详 (2025-12-26 23:20:19)
·关于 MySQL 数据库学 (2025-12-26 23:20:16)
·SOLVED: Ubuntu 24.0 (2025-12-26 22:51:53)
·Linux 常用命令最全 (2025-12-26 22:51:50)