android网络

序章

2019-02-26  本文已影响124人  流星泪x

我们要做一个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函数)

image

socket连接过程

socket连接过程

由此图看出socket,分为客户端和服务端,而建立连接后不会像http请求一样,响应后就断开连接了,而这条连接叫长连接。那么连接需要哪些要素呢?两个设备之间网络通信,首先要知道对方的IP,然后怎么知道是设备上的哪个程序,那么需要知道端口,到此就能正确的找到是哪个设备哪个程序了。那么消息怎么传输呢?因此可以选择TCPUDP。而传输数据实际上就是将其序列化成0 1的过程,有JsonXmlProtobuf三种选择;其差异见App网络传输协议json xml protobufiOS实现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

使用CocoaPodsCocoaAsyncSocketProtobuf的集成
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 https://www.jianshu.com/p/cf30e90c8269

上一篇 下一篇

猜你喜欢

热点阅读