一、 OSI、TCP/IP参考模型
IOS参考模型七层的作用
同一节点相邻层次间通过接口通信
各节点相同层次通过协议实现
TCP/IP参考模型简化
二、网络通讯要素
使用端口号的范围
ping的回环地址(网上没问题)、Ping IP(网络没问题),域名、DNS
本地域名缓存/etc/hosts (画图演示DNS hosts)
TCP/UDP
URL ftp:http
演示telnet 解决工作中常见问题
iVincent:~ Vincent_Guo$ telnet 220.181.111.188 80
Trying 220.181.111.188...
Connected to 220.181.111.188.
Escape character is '^]'.
GET /more/ HTTP/1.1
host:www.baidu.com
三、 socket聊天
启动聊天服务器 Python chatserver.py
键盘动画[self.view layoutIfNeeded];
连接到主机,分配输入输出流空间
建立长连接CFStreamCreatePairWithSocketToHost
将语言的输入输出流转成OC对象
设置代表监听输入输出流的状态
添加到主运行循环,否理代理不工作
[_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
打开输入输出流
登录发送
NSString *loginStr = [NSString stringWithFormat:@"iam:zhangsan"];
NSData *data = [loginStr dataUsingEncoding:NSUTF8StringEncoding];
[_outputStream write:data.bytes maxLength:data.length];
数据读取
//建立个缓冲区来保存读取到的数据
uint8_t buffer[1024];
//返回实际读取的数据长度
NSInteger len = [_inputStream read:buffer maxLength:sizeof(buffer
//有数据
if (len > 0) {
NSString *reveiver = [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];
}
断开连接要关闭输入输出流并移除主运行循环
回顾
netstat -an -p tcp 查看所有开放的端口查看连接状态
#import "ViewController.h" #define host @"192.168.95.102" #define port 12345 @interface ViewController ()<NSStreamDelegate>{ NSInputStream *inputStream; NSOutputStream *outputStream; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } -(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{ NSLog(@"%@",aStream); // NSStreamEventOpenCompleted = 1UL << 0, // NSStreamEventHasBytesAvailable = 1UL << 1, // NSStreamEventHasSpaceAvailable = 1UL << 2, // NSStreamEventErrorOccurred = 1UL << 3, // NSStreamEventEndEncountered = 1UL << 4 switch (eventCode) { case NSStreamEventOpenCompleted://数据流打开完成 NSLog(@"数据流打开完成"); break; case NSStreamEventHasBytesAvailable://有可读字节 NSLog(@"有可读字节"); [self readBytes]; break; case NSStreamEventHasSpaceAvailable:// 可发送字节 NSLog(@"可发送字节"); break; case NSStreamEventErrorOccurred://连接错误 NSLog(@"连接错误"); break; case NSStreamEventEndEncountered://到达流未尾,要关闭输入输出流 NSLog(@"到达流未尾,要关闭输入输出流"); [outputStream close]; [inputStream close]; [outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; [inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; break; default: break; } } - (IBAction)connect:(id)sender { //连接服务器 CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocketToHost(NULL,(__bridge CFStringRef) host, port, &readStream, &writeStream); inputStream = (__bridge NSInputStream *)(readStream); outputStream = (__bridge NSOutputStream *)(writeStream); inputStream.delegate = self; outputStream.delegate = self; [inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; [outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; [inputStream open]; [outputStream open]; } - (IBAction)login:(id)sender { NSString *str = @"iam:zhangsan"; NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; [outputStream write:data.bytes maxLength:data.length]; } -(void)readBytes{ uint8_t buffer[1012]; NSInteger len = [inputStream read:buffer maxLength:sizeof(buffer)]; NSData *data = [NSData dataWithBytes:buffer length:len]; NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",str); } @end