IOS Socket编程

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


你可能感兴趣的:(ios,socket)