iOS学习——Socket
了解socket,就需要了解数据在网络中传输。
网络通讯有三要素:ip地址,网络中设备的表示,例如本机用127.0.0.1,或者用本机名:localhost;端口号,用来标示进程的逻辑地址,也就是服务,有效端口0~65535,一般1024以下端口被系统或者本地服务所占据,开发中尽量不要使用,以避免冲突;通讯协议——UDP,TCP,UDP是用户数据报文协议,只负责发送数据,并不管是否被接收,不会建立联接,其会将数据和目的封装到数据包中。每个包大小为64K以内,数据传输速度很快,但是并不安全,一般用在游戏,直播之类的行业中;TCP则需要建立联接来传输数据,不会对数据做大小限制,需要通过三次握手协议来完成连接,安全可靠,缺点便是效率低。
三次握手建立连接:
首先client发送连接请求到服务器,服务器同意连接发送ACK报文,并为这次连接分配资源;client接收到ACK报文后,也向服务器发送ack报文,并为连接分配资源,这样TCP连接就建立成功。断开时采用四次挥手协议:
client发送断开连接请求,FIN报文,服务器接收到FIN报文了,知道client已经准备好结束连接,不再传输数据,但是如果服务器端没有准备好,不用着急关闭scoket,仍然可以发送数据前往client,此时需要发送ACK报文,告诉client请等待结束,让client进去FIN_WAIT状态。当服务器确定完成数据发送并可以关闭,发送FIN报文进入client,client接收到FIN报文后,并不会立刻断开连接,为了避免错误关闭状态,例如服务器没打算关闭连接,会向服务器发送ACK报文,并会进入TIME_WAIT状态,等待2MSL后未接收到服务器回应变正式断开连接,而服务器在接收到ACK报文后也会断开连接。
UDP会涉及到数据打包发送,这其中会需要了解osi七层模型:
进行数据传输,首先应用层形成源,然后在传输层通过TCP/UDP协议包装,在网络层,确定ip和端口号(形成socket),建立数据传输io,在数据链路层打包数据,每一包数据即为一帧,最后通过物理层转为电信号,电信号的传输标示采用高低电平,其实就是01数据,即二进制数据传输,所以网络中数据传输形式都是二进制。
了解这么多后,再来看socket概念。网络通信就是socket间的通信,需要两端都是socket,然后这两端建立IO传输。可以这样理解,socket是一种网络机制类,实例化的具体信息就是ip+端口。当我们使用qq聊天,a手机IP+qq端口发送信息,需要找到b手机IP+qq端口才能接收数据;
socket本身是用c语言书写,方便跨平台使用,使用起来也非常简单,基本可以归位五步。一步,创建socket,第二步,建立connect,第三步,write数据,第四步read数据,第五步colse;
首先,打开终端,输入命令:nc -lk 1025(监听端口号1025)
导入头文件:
#import <sys/socket.h> #import <netinet/in.h> #import <arpa/inet.h>
按操作创建socket连接:
1.创建socket
/**参数socket三个参数传入相应值domain: 协议域,AF_INET -> IPV4 AF_INET6 -> IPV6type: Socket 类型,SOCK_STREAM数据流/SOCK_DGRAM数据报文protocol: IPPROTO_TCP,如果传入0 那么会自动根据第二个参数选择合适的协议返回值socket*/int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
2.连接服务器
/**参数1> 客户端socket2> 指向数据结构sockaddr的指针,其中包括目的端口和IP地址3> 结构体数据长度返回值0 成功/其他 错误代号*/struct sockaddr_in severAddr;severAddr.sin_family = AF_INET;//端口severAddr.sin_port = htons(1025);//地址severAddr.sin_addr.s_addr = inet_addr("127.0.0.1");int connResult = connect(clientSocket, (const struct sockaddr *)&severAddr, sizeof(severAddr));if (connResult == 0) {NSLog(@"连接成功!!");}else{NSLog(@"失败了 %d",connResult);return;}
3.write数据,写入hello world 可以在简单端口看到相应展示
/**参数1> 客户端socket2> 发送内容地址3> 发送内容长度4> 发送方式标志,一般为0返回值如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR*/NSString * sendMsg =@"hello world";ssize_t sendLen = send(clientSocket, sendMsg.UTF8String, strlen(sendMsg.UTF8String), 0);
4.read数据,在端口下写入me too可以看到xcode打印结果展示
/**参数1> 客户端socket2> 接收内容缓冲区地址3> 接收内容缓存区长度4> 接收方式,0表示阻塞,必须等待服务器返回数据返回值如果成功,则返回读入的字节数,失败则返回SOCKET_ERROR*/uint8_t buffer[1024];//要把空间准备出来! ssize_t recvLen = recv(clientSocket, buffer, sizeof(buffer), 0);
5.最后便是便是关闭socket
close(clientSocket);
转载于:https://www.cnblogs.com/zhulilove/p/8016557.html
iOS学习——Socket相关推荐
- ios学习 准备列表
2019独角兽企业重金招聘Python工程师标准>>> Skip to content This repository Pull requests Issues Gist Watch ...
- iOS 学习资料整理
这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的 ...
- ios学习--iphone开发笔记和技巧总结(原址持续更新)
ios学习--iphone开发笔记和技巧总结(原址持续更新) 分类: ios Object-C2012-04-18 10:16 2716人阅读 评论(1) 收藏 举报 uiviewiphonelist ...
- iOS -- 学习资料总结(转载)
先著名转载地址:https://www.jianshu.com/p/c47c24ab1e76/ 关于iOS学习进阶的必读一些博客总结 经过一周的思考还是决定重组一下优秀的博客,首次整理这些博客比较乱, ...
- iOS 学习资料整理(中文版)
这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的 ...
- iOS学习资源汇总(开源项目、第三方库、技术博客等等)
iOS学习资源汇总(开源项目.第三方库.技术博客等等) 字数3919 阅读10309 评论29 喜欢297 前言 Github众所周知,全球最大的同性社区交友网站,在这里你可以获取任何你想要的,只要你 ...
- iOS学习资源汇总 - 开源项目、第三方库、技术博客
前言 Github众所周知,全球最大的同性社区交友网站,在这里你可以获取任何你想要的,只要你想,只要Ta有. 从事开发几年在Github上Star了不少好的东西,当然学到了更多,在此深深的膜拜下那些开 ...
- iOS学习资源汇总(开源项目、第三方库、技术博客)
本文转自:http://www.jianshu.com/p/b7c4a787a597 仅供学习 前言 Github众所周知,全球最大的同性社区交友网站,在这里你可以获取任何你想要的,只要你想,只要Ta ...
- iOS 学习资料大全
转: http://segmentfault.com/a/1190000002473595 这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他 ...
最新文章
- shell python -c_python, shell, C/C++ 从命令行获得参数
- Fedora 31 正式版今天发布,Python不是传说的3.8,而是3.7.4
- Linux学习:gcc 编译其他常用参数
- mysql备份时候事务日志_SQLSERVER备份事务日志的作用
- 用Fidder实现IOS手机抓包
- Math中的常用方法
- php-protobuf扩展和代码生成工具使用
- mysql解压缩版配置_MySQL 5.6 for Windows 解压缩版配置安装
- git github gitlib gitlab
- urllib常用小记
- 合作 | 2018数博会AI全球赛项目征集!提供场景、数据集,总奖金池500万
- 构建自己的NSZombie
- MATLAB点与点之间连线
- java .class 反编译工具推荐
- centos7安装tomcat8
- 自己收集的全国行政区划,具体到县级,不包括过直辖市和特别行政区
- Win10怎么合并磁盘分区 合并磁盘的操作方法
- 2017年5月20日软考考试报名开始啦
- 数据递归查询的两种实现方法
- GIT(分布式版本控制系统)入门
热门文章
- Nginx反向代理实现负载均衡web集群
- oralce9i备份的数据导入到oralce10g中的过程
- angularjs1-8,cacheFactory,sce
- strust2 和 hibernate的整合------登录的实现
- Linux/Unix操作系统目录结构的来历
- Linux——系统引导流程学习简单笔记
- 使用Eclipse构建GeoTools项目
- 自己构造公共程序(3)--DataGrid小方法
- android 移除泛型中元素_最新(2020)Android高级面试知识点干货分享(二)
- 算法学习(二)快速排序(下)