iOS提供的Socket网络编程的接口有CFSocket,BSD Socket,比较著名的第三方库是AsyncSocket。
- BSD Socket 是UNIX系统中通用的网络接口,它不仅支持各种不同的网络类型,而且也是一种内部进程之间的通信机制。而iOS系统其实本质就是UNIX,所以可以用,但是比较复杂。
- CFSocket 是苹果提供给我们的使用Socket的方式。
- AsyncSocket 是一个应用比较广泛的开源库。
下面我们用代码来演示如何使用AsyncSocket来创建一个服务器和客户端。
AsyncSocket全名是CocoaAsyncSocket,它的GitHub地址点此访问。AsyncSocket使用CocoaPods安装和拖放安装有所不同。CocoaPods上的版本只有GCDAsyncSocket,GItHub上多了RunloopAsyncSocket,而后者现在已经弃用,建议直接使用CocoaPods安装。
缺点是onsocketWillDisconnect
这个代理方法在GCD的版本里暂时没有,也没有找到替代方法。
下面开始使用AsyncSocket编写服务器端的程序,首先说一下要实现的目的:
- 用户输入昵称,将昵称发送给服务器,服务器返回在线名单;
- 客户端收到在线名单,利用在线名单生成联系人列表;
- 点击联系人列表,用户和服务器进行对话;
下面开始进入正题:
Server
这里创建的是Mac的Application,首先创建:
Socket单例类
|
|
添加3个属性,创建监听的方法:
|
|
添加一个属性,创建发送方法:
|
|
添加发送消息成功和连接成功两个代理方法:
|
|
添加收到消息的代理事件方法,并处理收到的消息:
|
|
添加断开连接的代理事件方法:
|
|
此时服务器的Socket封装已经做好了,下面是:
Server UI
|
|
下面是客户端的制作,这里是iOS的Application:
Client
同样首先封装一个Socket单例类:
Socket单例类
|
|
客户端和服务器的区别是不需要监听,但需要连接,所以创建连接服务器的方法:
|
|
创建消息发送的方法:
|
|
添加消息发送成功后的代理方法:
|
|
创建两个闭包,添加接收消息的代理方法,并处理接收的数据:
|
|
这样客户端的Socket就封装好了,下面是客户端的UI部分:
Client UI
客户端的UI比较复杂,分为3层,第一层是用户输入自己的昵称,将昵称发送到服务器,服务器返回在线名单,利用在线名单进入下一层。
第一层
搭建UI,点击发送时连接服务器并发送格式消息,利用闭包将传回的数据并打开第二层:
|
|
第二层
利用收到的在线名单,创建TableView列表,点击列表项时打开第三层:
|
|
第三层
点击发送对话到服务器,利用闭包将服务器返回的消息显示在这里:
|
|