我们要做一个IM(InstantMessaging 即时通讯),直观的从名字上看实效性是很重要的。那么以何种方式来实现呢?http轮询还是socket?
Http轮询
Http轮询分为短轮询、长轮询;何为短轮询,何为长轮询呢;以用户A给用户B发消息为例,用户B怎么知道对方发消息给自己呢?
短轮询
用户B不断的发送请求给服务器,查询是否有消息,然后服务器会立即响应这个请求;这就是短轮询
。那么这样会有什么问题呢?发送http请求,需要建立连接,响应后连接断开,这是一次http请求过程;如果不断的发送http请求,就会不断的建立连接、断开连接,这样很耗费资源。那怎么办呢?
长轮询
上面短轮询不断发送请求导致资源的浪费,那么是否可以减少请求的次数呢?于是就有B发送一个请求给服务器查询是否有消息;如果没有,此时服务器就会hold住这个请求,直到有消息或者是超时再响应;如果有,服务器会立即响应这个请求;这就是长轮询
。这样会有问题吗?虽然建立连接、断开连接的次数少了,但是如果用户数量很大,那么就会出现服务器hold住请求的数量增大,答案显然易见。
Socket
什么是socket?
socket是对TCP/IP协议的封装,它的出现只是使得程序员更方便的使用TCP/IP协议栈而已。socket本身并不是协议,它是应用层与TCP/IP协议族通信的中间软件抽象层,是一组调用接口(TCP/IP网络的API函数)
socket连接过程
由此图看出socket,分为客户端和服务端,而建立连接后不会像http请求一样,响应后就断开连接了,而这条连接叫长连接。那么连接需要哪些要素呢?两个设备之间网络通信,首先要知道对方的IP
,然后怎么知道是设备上的哪个程序,那么需要知道端口
,到此就能正确的找到是哪个设备哪个程序了。那么消息怎么传输呢?因此可以选择TCP
、UDP
。而传输数据实际上就是将其序列化成0
1
的过程,有Json
、Xml
、Protobuf
三种选择;其差异见App网络传输协议json xml protobuf。iOS
实现socket有调用OS底层C的BSD Socket
、基于原生Socket封装的CocoaAsyncSocket
。由于笔者技术能力有限,所以在此使用的是CocoaAsyncSocket
+ Protobuf
Protobuf
编译工具的安装
使用命令行的方式来安装,打开终端
// 查看是否安装homebrew
brew -v
// 安装homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
// 安装automake
brew install automake
// 安装libtool
brew install libtool
// 安装protobuf
brew install protobuf
使用CocoaPods
来CocoaAsyncSocket
与 Protobuf
的集成
1、打开Xcode,新建项目LXIMDemo
;打开终端,cd到项目的根目录,新建Podfile
文件,输入下面的内容并保存
target 'LXIMDemo' do
platform :ios, '8.0'
use_frameworks!
pod 'CocoaAsyncSocket'
pod 'Protobuf'
end
2、在终端输入pod install
后按回车
3、将.proto
文件编译成objc
的.h
.m
文件,因为编译后的OC
文件是不支持ARC
的,所以需要在targets->LXIMDemo->build phases->xxx.pbobjc.m添加-fno-objc-arc
// 编译命令
protoc xxx.proto --objc_out="./"
至此准备工作已完成。这也是笔者第一次写技术文章,如有问题请指出,与君共同学习,共同进步。
参考文章:
1、socket是什么? https://blog.csdn.net/github_34606293/article/details/78230456
2、socket连接过程.png //www.greatytc.com/p/cf30e90c8269