您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > IOSSocket通讯相关知识点
Socket通讯相关知识点服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。客户端,使用Javasocket通信对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。新手还是用用,NSURLConnection吧,相当简单CFNetwork基本结构在学习CFNetworkAPI之前,你必须首先理解作为CFNetwork基础的最主要的API。CFNetwork的存在依赖两个API,这两个API是CoreFoundation框架的一部分,CFSocket和CFStream。要使用CFNetwork就必须理解这些API。本节内容:CFSocketAPI CFStreamAPICFSocketAPISockets是网络通讯的最基本一层。一个socket起的作用类似与一个电话线接口,它可以使你连接到另一个socket上(不论是本地的还是网络另一端的),并且向那个socket发送数据。最常见的socket抽象概念就是BSDsockets,而CFSocket则是BSDsockets的抽象。CFSocket中包含了少数开销,它几乎可以提供BSDsockets所具有的一切功能,并且把socket集成进一个“运行循环”当中。CFSocket并不仅仅限于基于流的sockets(比如TCP),它可以处理任何类型的socket。你可以利用CFSocketCreate功能从头开始创建一个CFSocket对象,或者利用CFSocketCreateWithNative函数从BSDsocket创建。然后,需要利用函数CFSocketCreateRunLoopSource创建一个“运行循环”源,并利用函数CFRunLoopAddSource把它加入一个“运行循环”。这样不论CFSocket对象是否接收到信息,CFSocket回调函数都可以运行。请阅读CFSocket参考中有关CFSocketAPI的更多内容。CFStreamAPI对流的读写操作使我们可以以一种设备无关的方式在各种媒体之间交换数据。你可以为内存、文件或者网络(通过sockets)里面的数据创建流。另外在操作流的时候,所有数据可以分次加载。数据流本质上是在通信通道中串行传输的一个字节序列,它是单向的,所以如果需要双向传输的话必须操作一个输入流(读操作)和一个输出流(写操作)。除了基于文件的流以外,其他流都是不可搜索的,也就是说:在流数据被提供或者接收之后,就不能再从这个流当中获取数据了。CFStreamAPI用两个新的CFType对象提供了对这些流的一个抽象:CFReadStream和CFWriteStream。两个类型的流都遵循常见的核心基础API惯例。有关核心基础类型的更多信息,请参考设计概念。CFStream的构建基于CFSocket,同时也是CFHTTP和CFFTP的基础。在图1-2中你可以看到,尽管CFStream并不是CFNetwork的正式成员,它却是几乎所有CFNetwork成员的基础。图1-2CFStreamAPI的结构你几乎可以用操作UNIX文件描述符的方式对流进行读写操作。首先,实例化流对象的时候需要指定流的类型(内存、文件或者socket)并且设置任何一个可选项。然后,打开流并可以进行任意次的读写操作。当流还存在的时候,你可以通过流的属性获取有关它的信息。流属性包括有关流的任何信息,比如它的数据源或者目标,这些都不属于被读写的实际数据范畴之内。当你不再需要一个流的时候,需要关闭并把它丢弃。CFStream的函数如果不能进行至少一个字节数据的读写操作的话,它们可能会暂停或者阻塞当前的进程。为了避免在阻塞的时候从一个流读数据或者向一个流写数据,可以使用这些函数的异步操作版本,并且把有关这个流的操作放入一个循环当中。当可以从流中读写数据的时候,你的回调函数就会被调用。另外,CFStream还内置了对安全Sockets层(SSL)协议的支持。你可以建立一个包含流的SSL信息的字典,其中的信息包括需要的安全级别或者自签署的认证。然后把这些信息当作kCFStreamPropertySSLSettings属性传递给流,这样一个流就被转换成了一个SSL流。要创建一个客户定制的CFStream是不可能的。比如,如果你想要对客户数据库文件当中的对象进行数据流操作,那么仅仅希望通过创建具有自己风格的CFStream对象是办不到这一点的,而只有通过定制NSStream的子类(利用Objective-C)才可以做到。由于NSStream对象可以很容易的被转换为CFStream对象,所以你创建的NSStream子类可以被用在任何需要CFStream的地方。任何有关NSStream所属类的信息,请参考Cocoa流编程指南。对于socket的机制来说,应该都是差不多的如果用C来写的话,我给出一个简要说明1.1什么是Socket?Socket是网络文件描述符。在基于Socket的编程技术中,用户不直接访问发送和接收包的网络接口设备,而是建立一个中间文件描述符来处理编程接口到网络的操作。1.2Socket包括哪些内容?一个特殊的通信域,比如一个网络连接一个特殊的通信类型,比如流或者数据报一个特殊的协议,比如TCP或者UDP1.3Unix的Socket()C函数详细说明:intsocket(intdomain,inttype,intprotocol)domain的取值:PF_UNIXUnixIPC通信PF_INETIPV4通信PF_INET6IPV6PF_IPXNovellIPXPF_NETLINKKernel用户接口驱动程序PF_X25X.25PF_AX25PF_ATMPVCATMPVCPF_APPLETALKAppleTalk协议PF_PACKET低级包接口type的取值:SOCK_STREAM使用面向连接的通信包SOCK_DGRAM使用无连接的通信包SOCK_SEQPACKET使用有固定最大长度的面向连接的通信包SOCK_RAW使用原IP包SOCK_RDM使用不保证次序的可靠数据报Protocol:一般使用与type对应的默认协议,用0表示。例如:intnewsocket=socket(PF_INET,SOCK_STREAM,0);//使用TCP1.4使用面向连接的套接字IP领域只有两种类型:connection-oriented,connectionless使用面向连接的套接字,服务器和客户端需要如下通信方式:ServerClientsocket()socket()bind()listen()accept()----connect()recv()----send()send()----recv()close()---close()1.5使用无连接的套接字SOCK_DGRAM使用UDP协议。通信方式如下:UDPServerUDPClientsocket()socket()bind()recvform()---sendto()sendto()---recvform()close()close()1.6使用无阻塞的I/O方法什么是阻塞?比如使用recv(),如果函数接受不到数据,就会阻塞程序的继续执行。如何防止阻塞?使用fcntl()函数,把套接字设置为无阻塞模式。intnewsocket;newsocket=socket(PF_INET,SOCK_STREAM,0);fcntl(newsocket,F_SETEL,O_NONBLOCK);以后使用recv()就不会阻塞了。另一种方式是使用多路套接字select()2WinSock技术总的说来,就是模仿Unixsocket的实现。2.1WinSock下的函数和流程ServerClientWSAstartup()WSAStartup()WSASocket()WASSocket()bind()listen()WSAAccept()--WSAConnect()WSARecv()--WSASend()WSASend()--WSARecv()close()-close()WSACleanup()WSACleanup()与Unixsocket的最主要区别就是在最上面加了WSAStartup()函数,最后加了WSACleanup()函数。中间都是一样的。intWSAStartup(WORDwversion,LPWSADATAlpWSAData)第一个参数是版本,要求2.2还是1.1.函数成功以后,lpWSAData指向一个结构体,包括winsock的一些信息。WSACleanup()函数用来释放winsocket库,这个函数之后,再调用任何socket函数,都会出错。
本文标题:IOSSocket通讯相关知识点
链接地址:https://www.777doc.com/doc-2877463 .html