IOS Socket 通讯相关知识点

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Socket 通讯相关知识点

服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可

以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

客户端,使用Java socket通信对网络上某一个服务器的某一个端口

发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配

一个1024以上的端口。

新手还是用用,NSURLConnection吧,相当简单

CFNetwork基本结构

在学习CFNetwork API 之前,你必须首先理解作为CFNetwork基础的最主要的API。CFNetwork的存在依赖两个 API,这两个 API 是 Core Foundation 框架

的一部分,CFSocket和CFStream。要使用CFNetwork就必须理解这些 API。

本节内容:

CFSocket API CFStream API

CFSocket API

Sockets 是网络通讯的最基本一层。一个 socket 起的作用类似与一个电话线接口,它可以使你连接到另一个 socket 上(不论是本地的还是网络另一端的),并

且向那个 socket 发送数据。

最常见的 socket 抽象概念就是 BSD sockets,而CFSocket则是 BSD sockets

的抽象。CFSocket中包含了少数开销,它几乎可以提供 BSD sockets 所具有

的一切功能,并且把 socket 集成进一个“运行循环”当中。CFSocket并不仅仅限

于基于流的 sockets (比如 TCP),它可以处理任何类型的 socket。

你可以利用CFSocketCreate功能从头开始创建一个CFSocket对象,或者利

用CFSocketCreateWithNative函数从 BSD socket 创建。然后,需要利用

函数CFSocketCreateRunLoopSource创建一个“运行循环”源,并利用函数CFRunLoopAddSource把它加入一个“运行循环”。这样不论CFSocket对象是

否接收到信息,CFSocket回调函数都可以运行。

请阅读CFSocket参考中有关CFSocket API 的更多内容。

CFStream API

对流的读写操作使我们可以以一种设备无关的方式在各种媒体之间交换数据。

你可以为内存、文件或者网络(通过sockets)里面的数据创建流。另外在操作

流的时候,所有数据可以分次加载。

数据流本质上是在通信通道中串行传输的一个字节序列,它是单向的,所以如

果需要双向传输的话必须操作一个输入流(读操作)和一个输出流(写操作)。除了基于文件的流以外,其他流都是不可搜索的,也就是说:在流数据被提供

或者接收之后,就不能再从这个流当中获取数据了。

CFStream API 用两个新的CFType对象提供了对这些流的一个抽象:CFReadStream和CFWriteStream。两个类型的流都遵循常见的核心基础 API

惯例。有关核心基础类型的更多信息,请参考设计概念。

CFStream的构建基于CFSocket,同时也是 CFHTTP 和 CFFTP 的基础。在图

1-2 中你可以看到,尽管CFStream并不是CFNetwork的正式成员,它却是几乎

所有CFNetwork成员的基础。

图 1-2 CFStream API 的结构

你几乎可以用操作 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.2 Socket包括哪些内容?

一个特殊的通信域,比如一个网络连接

一个特殊的通信类型,比如流或者数据报

一个特殊的协议,比如TCP或者UDP

1.3 Unix的Socket() C函数详细说明:

int socket(int domain, int type, int protocol)

domain的取值:

PF_UNIX Unix IPC通信

PF_INET IPV4通信

PF_INET6 IPV6

PF_IPX Novell IPX

PF_NETLINK Kernel用户接口驱动程序

PF_X25 X.25

PF_AX25

PF_ATMPVC ATM PVC

PF_APPLETALK AppleTalk协议

PF_PACKET 低级包接口

type的取值:

SOCK_STREAM 使用面向连接的通信包

相关文档
最新文档