iOS中Socket的初探.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
iOS中Socket的初探

SocketSocket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。tcp和udp的区别TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。关于TCP是一种流模式的协议,UDP是一种数据报模式的协议,这里要说明一下,TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的。TCP三次握手所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。?三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的序列号加1以,即X+1。第三次握手:客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1。并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写序列号的+1。一般来说,一个用户(对于ios来说也就是我们的项目中)只能有一个正在连接的socket,所以这个socket变量必须是全局的,如果对一个已经连接的socket对象再次进行连接操作,会抛出异常(不可对已经连接的 socket进行连接)程序崩溃,所以在连接socket之前要对socket对象的连接状态进行判断,再次连接时,需要手动断开通常开发过程中,我们多使用第三方库:AsyncSocket,用起来比较直观,也比较好上手导入AsyncSocket.h、AsyncSocket.m,、AsyncUdpSocket.h, AsyncUdpSocket.m添加CFNetwork.framework首先,创建一个单利,用于实现socket的连接、发送数据、接收数据等创建socket对象: self.socket = [[AsyncSocket alloc] initWithDelegate:self];//初始化,并设置代理建立连接 [self.socket connectToHost:self.socketHost onPort:self.socketPort withTimeout:3 error:error];//self.socketHost,代表服务器的ip地址或者域名,self.socketPort代表连接的端口号发送数据请求:[self.socket writeData:_userData withTimeout:1 tag:1];//_userData,表示传输给服务器的数据,这里包含要调用服务器的方法名、参数等等,注意,此data由string转换而来,编码采用utf8数据接收请求:[self.socket readDataWithTimeout:30 tag:1];//注意,此句代码不可省略,否则会收不到服务器的返回,这句代码可以写在writeData之后,也可以写在连接成功的代理方法里几个代理方法:-(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{ NSLog(@socket连接成功);}-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{ // 服务器返回数据处理,对得到的data值进行解析与转换即可 NSString* message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];NSLog(@message

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档