您的位置:首页 > 移动开发 > IOS开发

IOS Socket 03-建立连接与登录

2016-05-05 15:06 666 查看
1. 搭建python服务器

这里我们用到python服务器Socket Server。如何运行Server?下面介绍

1)通过百度云下载文件 http://pan.baidu.com/s/1i5ybxg5

下载完成文件之后,可以看到倒数第三行的代码,reactor.listenTCP(12345, factory)。 这里可以修改端口号12345。

2)然后我们运行文件。

首先,在mac机器上打开终端,在终端上到chatserver.py的文件目录下。然后输入命令:python chatserver.py,按回车。

可以看到,有‘Iphone Chat server started’的字样。证明服务器已经开启。

2. 客户端 - 与服务器建立连接与登录

1)首先建立连接(通过3次握手)

定义全局变量:

NSInputStream *_inputStream;
NSOutputStream *_outputSteam;


与服务器建立连接:

/**IOS实现sokcet连接是通过使用C语言**/

// 1.与服务器通过三次握手建立连接
,设置主机(本机)和端口号
NSString *host = @"127.0.0.1";
int port = 12345;

// 2.定义输入输出流
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

// 3.分配输入输出流的内存空间
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);

// 4.把C语言的输入输出流转成OC对象
_inputStream = (__bridge NSInputStream *)readStream;
_outputSteam = (__bridge NSOutputStream *)(writeStream);

// 5.设置代理,监听数据接收的状态
_outputSteam.delegate = self;
_inputStream.delegate = self;

// 把输入输入流添加到主运行循环(RunLoop)
主运行循环是监听网络状态
[_outputSteam scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

// 6.打开输入输出流
[_inputStream open];
[_outputSteam open];


2)然后实现delegate

首先实现NSStreamDelegate,然后实现delegate必须的方法:(代理的回调函数-下面方法,是在主线程中完成的)

-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{
switch (eventCode) {
case NSStreamEventOpenCompleted:
NSLog(@"aStream: %@",aStream);
NSLog(@"成功连接建立,形成输入输出流的传输通道");
break;

case NSStreamEventHasBytesAvailable:
NSLog(@"有数据可读");
//读取数据
[self readData];
break;

case NSStreamEventHasSpaceAvailable:
NSLog(@"可以发送数据");
break;

case NSStreamEventErrorOccurred:
NSLog(@"有错误发生,连接失败");
break;

case NSStreamEventEndEncountered:
NSLog(@"正常的断开连接");
[_inputStream close];

[_outputSteam close];

[_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[_outputSteam removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

break;

default:
break;
}
}


读取服务器返回的数据:

#pragma mark 读取服务器返回的数据

-(void)readData{
//定义缓冲区 这个缓冲区只能存储1024字节

uint8_t buf[1024];

//读取数据
len为服务器读取到的实际字节数

NSInteger len = [_inputStream read:buf maxLength:sizeof(buf)];

// 把缓冲区里的实现字节数转成字符串
NSString *receiverStr = [[NSString alloc] initWithBytes:buf length:len encoding:NSUTF8StringEncoding];
NSLog(@"%@",receiverStr);
}


3)上诉实现与服务器连接后,我们发送数据给服务器实现登录

- (void) loginServer {
//发送登录请求 使用输出流。 拼接登录的指令 iam:zhangsan
NSString *loginStr = @"iam:zhangsan";

//uint8_t * 字符数组
NSData *data = [loginStr dataUsingEncoding:NSUTF8StringEncoding];
[_outputSteam write:data.bytes maxLength:data.length];
}


查看本文章之前,可以看看

IOS Socket 02-Socket基础知识

也可以看下一篇文章

IOS Socket 04-利用框架CocoaAsyncSocket实现客户端/服务器端
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: