一、 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