iOS 开发基础(6)--网络通信

iOS 开发基础(6)--网络通信,第1张

OSI 的七层协议体系结构的概念清晰,理论完整,当时它既复杂又不实用; TCP/IP 体系结构则不同,但是它现在却得到了非常广泛的应用,不过从实质上讲, TCP/IP 只是最上面的三层,因为最下面的网络接口层并没有什么具体内容;因此在学习计算机网络的时候往往采取折中的方法,即综合 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构;

iOS 开发中的网络通信主要是在传输层和应用层进行一些网络 IP 地址,端口以及协议的一些处理;首先是网络层的两种传输协议 UDP 和 TCP 的含义以及区别:

用户数据包协议;UDP 在传输数据之前不需要先建立连接远地主机的运输层在收到 UDP 报文后,不需要给出任何确认;
主要特点:

传输控制协议; TCP 提供面向连接的服务;在传输数据之前必须先建立连接,数据传输完成后要释放连接;建立连接需要通过三次握手,而释放连接需要四次握手;
主要特点:

第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

这个问题的本质就是信道不可靠,但是通信双方需要中间传输的数据是可靠的,而要解决这个问题,无论你是在信息中包含什么信息,三次通信是理论上的最小值,所以三次握手不是TCP本身的要求,而是为了满足在不可靠信道上可靠的传输信息这一需求所致的;这里的本质需求就是,信道不可靠,数据传输要可靠,三次握手之后你先继续握手还是发数据也好,跟进行可靠信息传输的需求就没关系了,因此如果信道可靠,无论什么时候发出消息,对方一定能收到,或者你不关心是否要保证对方收到你的消息,那就能像UDP那样直接发送消息就可以;

1当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据接口(当然确认信号还是可以发),就会发FIN给主机B;
2主机B收到A发送的FIN,表示收到了,就会发送ACK回复;
3但是这时B可能还在发送数据,没有想要关闭数据口的意思,所以FIN和ACK不是同时发送的,而是等到B数据发送完,才会发送FIN给主机A;
4A收到B发来的FIN,知道B的数据也发送完了,回复ACK,A等待2MSL以后,没有收到B传来的任何消息,知道B已经收到自己的ACK了,A就关闭链接,B也关闭链接;

在客户端发送最后的ACK回复,但是该ACK可能丢失。服务端如果没有收到ACK,将不断重复发送FIN片段。所以客户端不能立即关闭,它必须确认服务端接收到了该ACK,客户端会在发送出ACK之后进入到TIME_WAIT状态,客户端会设置一个计时器,等待2MSL的时间,如果在该时间内再次收到FIN,那么客户端会重发ACK并再次等待2MSL;所谓2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果知道2MSL,客户端都没有再次收到FIN,那么客户端推断ACK已经成功接收,则结束TCP连接;

>

SOAP是简单对象访问协议,它可看成是>

在iOS中使用SOAP,需要我们自己组装XML格式的字符串,当XML字符串比较长的时候会变得很麻烦。另外,我们在写XML格式的字符串时也要经常使用转义字符“\”。

这个结果呢不大准确,因为我输入的号码是动感地带的。但不影响本文主题。

看看刚才那个网页的内容,注意到SOAP 12标签下的内容:

我们要用到的只有getMobileCodeInfoResult这个标签。

这次的例子是实现通过SOAP服务查询手机号码归属地、运行商等信息。PS:用的Xcode 441。

1、运行Xcode 441,新建一个Single View Application,名称为SOAP Test:

2、界面设计:打开ViewControllerxib,设计界面如下所示:

在文本输入框的Attribute Inspector中设置其Keyboard属性为Number Pad。

3、之后向ViewControllerh中,为文本输入框创建OutLet映射,名称为:phoneNumber;为“查询”按钮创建Action映射,事件类型为Touch Up Inside,名称为:doQuery。建立映射的方法就是打开Assistant Editor,选中某一控件,按住Ctrl,拖向ViewControllerh,可以参考前面的文章。

4、在ViewControllerh中添加代码:

41 在@interface那行最后添加代码

<NSXMLParserDelegate,  NSURLConnectionDelegate>

使ViewController遵守这两个协议。前者用来解析XML,后者用于网络连接。

42 在@end之前添加代码

@property (strong, nonatomic) NSMutableData webData;
@property (strong, nonatomic) NSMutableString soapResults;
@property (strong, nonatomic) NSXMLParser xmlParser;
@property (nonatomic) BOOL elementFound;
@property (strong, nonatomic) NSString matchingElement;
@property (strong, nonatomic) NSURLConnection conn;

5、在ViewControllerm中添加代码:

51 在@implementation之后添加代码

@synthesize webData;
@synthesize soapResults;
@synthesize xmlParser;
@synthesize elementFound;
@synthesize matchingElement;
@synthesize conn;

52 实现doQuery方法

可能是手机固件版本与手游不兼容。

可以尝试下手机固件升级到最新版本,步骤如下:

苹果Mac系统的用户下直接打开dmg文件,即可看到ipsw固件文件。而Windows系统用户可以利用WinRar把dmg文件解压后就可以看到ipsw格式文件。

打开iTunes,Mac用户按住option键(Windows用户按住shift键),点击“检查更新”(注意不是恢复),选择刚才加载的dmg中的ipsw固件文件即可,然后等待升级完成,最后就是激活机器。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10552205.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存