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 04-利用框架CocoaAsyncSocket实现客户端/服务器端
可以关注本人的公众号,多年经验的原创文章共享给大家。