您的位置:首页 > 其它

SOCKET访问基本模型

2015-09-16 09:27 369 查看
#import "ViewController.h"

@interface ViewController () <NSStreamDelegate>
{
NSInputStream *inputStream;
NSOutputStream *outputStream;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
}

#pragma mark - NSStreamDelegate
/**
*
*
*  @param aStream
*  @param eventCode NSStreamEventOpenCompleted = 1UL << 0,         //输入输出流打开完成
NSStreamEventHasBytesAvailable = 1UL << 1,     //有字节可读
NSStreamEventHasSpaceAvailable = 1UL << 2,     //可以发送字节
NSStreamEventErrorOccurred = 1UL << 3,         //连接出现错误
NSStreamEventEndEncountered = 1UL << 4         //连接结束
*/
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
NSLog(@"%@", aStream );

switch ( eventCode )
{
case NSStreamEventOpenCompleted:
NSLog(@"输入输出流打开完成");
break;

case NSStreamEventHasBytesAvailable:
NSLog(@"有字节可读");

[self readData];    //服务器返回数据
break;

case NSStreamEventHasSpaceAvailable:
NSLog(@"可以发送字节");
break;

case NSStreamEventErrorOccurred:
NSLog(@"连接出现错误");
break;

case NSStreamEventEndEncountered:
NSLog(@"连接结束");

//关闭输入输出流
[inputStream close];
[outputStream close];

//从主运行循环中移除
[inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

break;

default:
break;
}
}

/**
*  读取字节数据
*/
- (void)readData
{
//建立一个缓冲区 可以放1024个字节,这里只做理解,实际返回数据可能远不止1024
uint8_t buf[2014];

//length是返回直接可以装的字节数
NSInteger length = [inputStream read:buf maxLength:sizeof(buf)];

//把字节转换成字符串
NSData *data = [NSData dataWithBytes:buf length:length];

//从服务器接收到的数据
NSString *readStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"%@", readStr );

}

#pragma mark - 连接服务器

/**
*  连接服务器
*/
- (IBAction)connectionServer:(id)sender
{
//一、建立连接
NSString *host = @"127.0.0.1";
int port = 12345;
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);  //C语言建立与服务器的连接

//1-1、将C语言的输入输出流转换成OC对象
inputStream = (__bridge NSInputStream *)(readStream);
outputStream = (__bridge NSOutputStream *)(writeStream);

//1-2、设置代理
inputStream.delegate = self;
outputStream.delegate = self;

//1-3、将输入输出流添加到主运行循环
[inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

//1-4、打开输入输出流
[inputStream open];
[outputStream open];
}

#pragma mark - 发送数据

/**
*  模拟发送数据
*/
- (IBAction)clickWithSendMessage:(id)sender
{
//二、收发数据
//收发数据模拟“用户登录”场景
NSString *loginStr = @"iam:zhangsan";  //特定字符,服务器模拟对象:zhangsan
NSData *data = [loginStr dataUsingEncoding:NSUTF8StringEncoding];
[outputStream write:data.bytes maxLength:data.length];     //write一个流去服务器  write:这里是字节数组   maxLength:长度
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: