zoukankan      html  css  js  c++  java
  • iOS-Socket编程体验

    Socket编程体验




    Socket编程体验 



























    网络编程 
     网络模型OSI(开放系统互联Open SystemInterconnection)TCP/IP
    考模型
     网络通讯要素 - IP地址
    端口号传输协议




    七层简述 
    .1. 物理层:主要定义物理设备标准,如网线的接口类型、各种传输介质的传 输速率等。主要作用是传输比特流(就是由10转化为电流强弱来进行传 输,到达目的地后再转化为10,也就是常说的数模与模数转换)。这一 层的数据叫做比特(bit),主要设备:集线器 
    .2. 数据链路层:主要将从物理层接收的数据进行MAC地址的封装与解封装。 常把这一层的数据叫做帧,主要设备:交换机 
    .3. 网络层:选择合适的网间路由和交换结点, 确保数据及时传送,将从下层 接收到的数据进行IP地址的封装与解封装。常把这一层数据叫做数据包,主 要设备:路由器。 
    .4. 传输层:定义了一些传输数据的协议和端口,如TCPUDP协议,主要将从 下层接收的数据进行分段和传输,到达目的地址后再进行重组,以往把这 一层数据叫做段。 
    .5. 会话层:通过传输层建立数据传输通路。在系统之间发起会话或者接受会 话请求(设备之间需要互相认识) 
    .6. 表示层:主要是进行对接收的数据进行解释、压缩与解压缩等,即把计算 机能够识别的东西转化成人能够识别的东西(如图片、声音等) 
    .7. 应用层:主要是一些终端的应用,比如说FTP(各种文件下载)、浏览器、 QQ等,可以将其理解为在电脑屏幕上可以看到的东西,也就是终端应用。 

    网络通讯要素 
     IP地址(唯一标示网络设备的0~255 2^32 = 4G): - 网络中设备的标示不易记忆,可以用主机名-本地回环地址:127.0.0.1 主机名:localhost 
     端口号(定位程序) 
    - 用于标示进程的逻辑地址,不同进程的标示 
    - 有效端口:0~65535,其中0~1024由系统使用或者保留端口,开发 中不要使用1024以下的端口 
     传输协议(用什么样的方式进行交互) - 通讯的规则 
    常见协议:TCPUDP 
     http://ip:80/文件路径 => URL(统一资源定位) 
     资源类型是通过MimeType来区分的,告诉客户端是什么类型的 资源 


    • URL(确定要访问的资源) •Request=》要访问了• Connect=》开始访问• ....
    • 返回结果




    TCP & UDP 
    • UDP(用户数据报协议)将数据及源和目的封装成数据包中,不需要建立连接 - 每个数据报的大小限制在64K之内因为无需连接,因此是不可靠协议不需要建立连接,速度快
    • TCP(传输控制协议)建立连接,形成传输数据的通道在连接中进行大数据传输(数据大小不收限制) - 通过三次握手完成连接,是可靠协议,安全送达 - 必须建立连接,效率会稍低 

    Socket(套接字层、插座--AT&T
    • Socket就是为网络服务提供的一种机制 - Unix中,网络既是Socket,并不局限在TCP/UDP - Socket可以用于自定义协议 QQ
    • 通信的两端都是Socket
    • 网络通信其实就是Socket间的通信• 数据在两个Socket间通过IO传输 


    Socket通讯流程图 

    使用Socket开发网络通讯 
    • Web服务(WebServices=>XML)大行其道的今天,调用Web服 务的代价是高昂的,尤其是仅仅是抓取少量数据的时候尤其如 此。而使用Socket,可以只传送数据本身而不用进行XML封装, 大大降低数据传输的开销(JSON)
     Socket允许使用长连接,允许应用程序运行在异步模式(提高 效率),只有在需要的时候才接收数据 

    iOS中常用的两种Socket类型 
    Ø 流式Socket(SOCK_STREAM):流式是一种面向连接的
    Socket,针对于面向连接的TCP服务应用
    Ø 数据报式Socket(SOCK_DGRAM):数据报式Socket是一 种无连接的Socket,对应于无连接的UDP服务应用

    iOS中流式Socket连接的方法 
    • iOS中以NSStream()来发送和接收数据• 可以设置流的代理,对流状态的变化做出相应
    连接建立接收到数据 - 连接关闭
    1. NSStream:数据流的父类,用于定义抽象特性,例如:打开、关闭 代理,NSStream继承自CFStream(Core Foundation)
    2. NSInputStream:NSStream的子类,用于读取输入 3. NSOutputStream:NSSTream的子类,用于写输出 

    开发步骤 
    1. 网络连接设置1. 设置网络连接,绑定到主机和端口2. 设置输入流和输出流的代理,监听数据流的状态 3. 将输入输出流添加至运行循环4. 打开输入流和输出流
    2. 发送消息给服务器3. 有可读取字节时,读取服务器返回的内容4. 到达流末尾时,关闭流,同时并从主运行循环中删除

    设置网络通讯 
    CFReadStreamRef readStream;!
    CFWriteStreamRef writeStream;!
    !
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"localhost", 12345, &readStream, &writeStream);!
    !
    _inputStream = (__bridge NSInputStream *)readStream;!_outputStream = (__bridge NSOutputStream*)writeStream;!
    说明:CFStreamCreatePairWithSocketToHost函数用于将输入流和输出流 绑定到指定主机的对应端口,连接建立之后,既可以像输入流写入数据, 或者从输出流读取数据


    设置流代理并添加至运行循环 
    _inputStream.delegate = self;!
    _outputStream.delegate = self;!
    !
    // 将输入、输出流添加至运行循环!
    [_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop]forMode:NSDefaultRunLoopMode];!
    [_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop]forMode:NSDefaultRunLoopMode];!
    !
    // 打开输入、输出流 [_inputStream open];! [_outputStream open]; 

    发送登录请求给服务器 
    // 1. 创建要发送的字符串 NSString *sendMsg = [NSStringstringWithFormat:@"iam:%@",
    _userNameText.text];!
    // 2. 将字符串转换成NSData NSData *sendData = [sendMsgdataUsingEncoding:NSUTF8StringEncoding];! !
    // 3. 写入数据 [_outputStream write:[sendData bytes]maxLength:[sendData length]]; 

    数据流事件响应 
    switch (eventCode) {!
    case NSStreamEventOpenCompleted:!
    NSLog(@"数据流打开完成");!
    break;!
    case NSStreamEventHasBytesAvailable:!
    NSLog(@"有字节读取");!
    break;!
    case NSStreamEventHasSpaceAvailable:!
    NSLog(@"可以写入数据");!
    break;!
    case NSStreamEventErrorOccurred:!
    NSLog(@"无法连接到服务器");!
    break;!
    case NSStreamEventEndEncountered:!
    NSLog(@“到达流末尾,需要关闭流");!
    break;! default:!
    NSLog(@"未知");!
    break;! } 

    有字节读取,则读取从服务器返回消息 
    // 服务器返回数据,从输入流中读取数据 // 定义一个字符串缓冲数组,用于接收数据 uint8_t buffer[1024];!
    // 送输入流中读取数据,并获得读取内容的长度 int len = [_inputStream read:buffermaxLength:sizeof(buffer)];! !
    // 判断是否有读入的内容 if (len > 0) {!
    // 将读入的数据转换成字符串 NSString *str = [[NSString alloc] initWithBytes:buffer
    length:len encoding:NSUTF8StringEncoding];!NSLog(@"=======> %@", str);!
    } 

    到达流末尾,关闭流并且从运行循环中删除 • [aStreamclose];!
    • [aStreamremoveFromRunLoop:[NSRunLoopmainRunLoop]forMode:NSDefaultRunLoopMode];!

    回顾 
    • Socket就是为网络服务提供的一种机制Socket允许使用长连接,允许应用程序运行在异步模式,
    只有在需要的时候才接收数据
     流式Socket(SOCK_STREAM):流式是一种面向连接的 Socket,针对于面向连接的TCP服务应用

    Thanks! Q & A 

    © chenyilong. Powered by Postach.io


    作者:
    出处:http://www.cnblogs.com/ChenYilong/(点击RSS订阅)
    本文版权归作者和博客园共有,欢迎转载,
    但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    python生成xml文件
    gcc基本用法
    Java删除文件或目录及目录下所有文件
    QTimer在QThread环境中失效的问题
    fopen打开文件失败的问题
    利用枚举,简化多个标志位统计
    QTableView表格自动拉伸
    django1.11 启动错误:Generator expression must be parenthesized
    css选择器
    property使用
  • 原文地址:https://www.cnblogs.com/ChenYilong/p/3587209.html
Copyright © 2011-2022 走看看