IOS的socket编程学习笔记

苹果的Socket编程,常用的是CFNetwork库编程,Socket编程是一个异步的过程,socket的联接方法,不是会等到连接完成后再执行下一行代码,如果你想在一个连接完全执行完之前与一个Socket完全绑定,那么就会容易得到一个意想不到的结果。
     连接一台Socket服务器你需要确定两个信息,一个是Socket服务器的域名或者IP地址,另一个是服务器监听的端口号.在尝试一个新的Socket连接的时候我们最好先添加一个连接事件监听器.
     CFNetwork库编程,其封装好的开源库是 cocoa AsyncSocket库,它在调用读和写方法完成后,会返回通知,并且能自动地进行socket接收和为每个连接启动新的实例,并且简化了一些流程。
代码如下:

1 //客户端
2 #import "AsyncSocket"
3 @interface HelloIphoneViewController:UIViewController{
4 UITextField *textField;
5 AsyncSocket *asyncSocket;
6 }
7 @property(retain,nonatomic)IBOutlet UITextField *textFiled;
8 -(IBAction)buttonPressed:(id)sender;
9 -(IBAction)textFiledDoneEditing:(id)sender;

//这里用port=0是让系统自动随机找一个空闲端口。其他都是基于c风格对系统函数的直接调用。
//从Socket服务器读数据
对于Socket实例,先收到NSData事件后,然后调用如下两个方法一个,如radByte()或者readInt()什么,在事件控制器确定不会去读过去的bytesAvailable,socket是一个异步的过程,那么我们就不能在socekt一连接,就马上去读数据,而是要等到客户端从服务器载入全部的数据在去读取数据,否者在数据可用之前读数据会产生错误,因此,我们可以通过NSData事件广播到Socket实例,这样就可以知道什么时候,可以读取数据。在需要连接的地方使用connectToHost联接服务器,代码如下:

1 asyncSocket=[[AsyncSocket alloc] initWithDelegate:self];
2 NSError *err=nil;
3 if(![asyncSocket connectToHost on:port error:&err]){
4     NSLog(@"Error:%@",err);
5 }
6 NSD

NSData拥有id和length两个属性的数据空间

1 //NSString 转成NSData
2 NSData *xmlData=[@"data" dataUsingEncoding:NSUTF8StringEncoding];
3 //NSData转换成NSString
4 NSData *data;
5 NSString *result=[[NSString alloc] initWithData:data  encoding:NSUTR8StringEncoding];

通过AsyncSocket:writeDate来发送数据

1 -(void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
2 NSData *aData=[@"tes" dataUsingEncoding:NSUTR8StringEncoding];
3 [socke writeData:aData withTimeout -1 tag:1];

通过重载来处理发送的数据

1 -(void)onSocket:(AsyncSocet *)sock didWriteDataWithTag:(long)tag
2 {{
3     NSLog(@"thread(%),onSocket%p didWriteDataWithTag:%d",[[NSThread currentThread] name] ,sock,tag);
4 }

接收Socket数据,在onSocket重载函数

1 -(void)onSocket:(AsyncSocet *)sock didReadData:(NSData *)data withTag:(long)tag;

当收到的数据为ASCII编码,你可以通过方法重新构建一个字符串.

1 NSString *aStr=[[NSString alloc] initWithData:data encoding:NSUTR8StringEncoding];
2 NSLog(@"==%@",aStr);
3 [aStr release];
4 TCP连接读取制定长度的数据
5 socket可以读取固定长度的字节
6 [socket readdataToLength:withTimeout:tag];
7 //============================================

部分方法的解析

1 -(void)onSocket:(AsyncSocket *)sock willDisconnectError:(NSError *)err

发生错误,socket关闭,可以在call-back过程调用"unreadData"去取得socket的最后的数据字节,当连接的时候,该委托方法在 onSocket:didAcceptNewSocket: 或者 onSocket:didConnectToHost: 之前调用;

1 -(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket(AsyncSocket *)didAcceptNewSocket;

当socket由于或没有错误而断开连接,如果你想要在断开连接后release socket,在此方法工作,而在onSocket:willDisconnectWithError 释放则不安全;

1 -(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket(AsyncSocket *)didAcceptNewSocket

当产生一个socket去处理连接时调用,此方法会返回 线程上的run-loop 的新的socket和其应处理的委托,
如果省略,则使用[NSRunLoop cunrrentRunLoop];

1 -(void)onSocket(AsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;

当一个socket写入一些数据,但还没有完成整个写入时调用,它可以用来更新进度条等东西;

1 -(NSTimeInterval)onSocket(AsyncSocket *)sock shouldTimeoutreadWithTag:(long)tag elapsect(NSTimeInterval)

2 exapsed bytesDone:(NSUInteger)length

使用读操作已超时但还没完成时调用,此方法允许随意延迟超时,如果返回一个正的时间间隔,
读取的超时将有一定量的扩展,如果不实现这个方法,或会像往常一样返回一个负的时间间隔,elapsed参数是 原超时的总和,加上先前通过这种方法添加的任何补充, length参数是
读操作到目前为止已读取的字节数, 注意,如果返回正数的话,这个方法可能被一个单独的读取多次调用.
当传入的连接被接受,AsyncSocket调用多个委托方法,这些方法按时间:

1、onSocket:didAcceptNewSocket;
2、onSocket:wantsRunLoopForNewSocket;
3、onSocketWillConnect
-(BOOL)acceptOnPort(UInit16)port error:(NSError *)errptr;

告诉socket开始听取和接受指定端口上的连接,当一个连接到来的时候,AsyncSocket实例将调用各种委托方法,socket将听取所有可用的接口(wifi,以太网等)

-(BOOL)connectToHost(NSString *)hostname onPort(UInit16) port error:(NSError *)errPtr;

连接给定的主机和端口,主机hostname可以是域名或者是Ip地址

-(BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError *)errPtr;

连接到一个给定的地址,指定一个sockaddr结构包裹住一个NSData对象,例如,NSData对象从NSNetService的地址方法返回,如果有一个现有的sockaddr结构,可以将它转换到一个NSData对象,像这样:

struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];

立即断开,任何未处理的读或写都将被丢弃

-(void)disconnect()
时间: 2024-10-01 22:10:22

IOS的socket编程学习笔记的相关文章

Android Socket编程学习笔记

通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务. 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定. 在java中,Socke

JAVA Socket 编程学习笔记(二)

在上一篇中,使用了 java Socket+Tcp/IP  协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用 UDP 协议来实现 Socket 的通信. 1. 关于UDP UDP协议(用户数据报协议)是无连接的.不可靠的.无序的,速度快,进行数据传输时,首先将要传输的数据定义成数据报(Datagram),大小限制在64k,在数据报中指明数据索要达到的Socket(主机地址和端口号),然后再将数据报发送出去,Java 对UDP 协议通信提供了两个主要的类,DatagramPac

JAVA Socket 编程学习笔记(一)

1. Socket 通信简介及模型 Java Socket 可实现客户端--服务器间的双向实时通信.java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的client和server端. 2. Socket 通信实现方法 2.1  服务器端(非多线程)  用指定的端口实例化一个SeverSocket对象.服务器就可以用这个端口监听从客户端发来的连接请求. 调用ServerSocket的accept()方法,以在等待连接期间造成阻塞,监听连接从端口上发来的连接

python socket编程学习笔记2

 server.py: [服务端步骤]: 1.创建socket对象 2.将socket绑定到指定地址(bind) 3.监听连接请求(listen) 4.等待客户请求(accept) 5.处理请求(服务器和客户端通过send和recv方法通信(传输 数据). 6.传输结束后关闭连接(close) client.py: [客户端步骤]: 1.创建socket对象 2.创建连接(connect) 3.处理阶段(send方法和recv方法通信) 4.关闭连接 (close)

转 网络编程学习笔记一:Socket编程

网络编程学习笔记一:Socket编程 “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下:

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

黑马程序员_JAVA UDP网络编程学习笔记

一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路.与TCP通信不同,UDP是面向无连接的.不可靠的基于数据包的传输协议.即应用进程(或程序)在使用UDP协议之前,不必先建立连接.自然,发送数据结束时也没有连接需要释放.因此,减少了开销和发送数据之前的延时.UDP也采用端口来区分进程. 在java中,java.

.NET网络编程学习笔记

IPAddress类使用实例: IPAddress.Parse("192.168.0.1")  //将string类型的IP地址转换为IPAddress实例 IPAddress.Loopback   //获得本地环回IP地址,具体为 127.0.0.1 IPAddress.Broadcast  //获得广播IP地址地址,具体为 255.255.255.255 IPAddress.Any          //具体地址为0.0.0.0 ,Socket.Bind 方法使用 Any 字段指示

《iOS应用逆向工程》学习笔记(四)iOS程序类型

越狱iOS中最常见的程序有Application, Dynamic Library和Daemon三类. 1.Application 除了传统意义上的App外,越狱iOS平台上还有两种App形式的存在:WeeApp(依附于NotificationCenter的App)和PreferenceBundle(依附于Settings的App),常见于Cydia平台. 普通App的bundle中存放的是可执行程序和所需资源,而framework的bundle中存放的是动态链接库. 主要关注App中的三个部分