概述
一直都想写些什么,刚好这两年一直都在做聊天app,想了很久决定把底层网络库开源出来。两年来这个库经历了好几个阶段:
- java实现,BIO连接
- java实现,NIO连接
- c/c++实现,NIO连接
本次要开源出来的是c/c++实现的版本,取名fastsocks
,github地址:
fastsock
参考了Telegram
的部分实现,如果对大家对Telegram
还不熟悉,可以去它的官网 逛逛。
长连接必然要涉及到序列化/反序列化、数据包收发、重连、动态ip/port切换、推送等内容,接下来都将逐一介绍。
开发环境
新版本的android studio
已经支持ndk开发,并且加入了cmake 的支持,如果大家对cmake还不熟悉,请查看官网。下面是我的开发环境:
android studio版本 | gradle版本 | ndk版本 |
---|---|---|
2.3.1 | 2.2.3 | 14.1 |
fastscoks
使用cmake编译c/c++代码,开发之前先安装好cmake插件,当然了为了方便调试c/c++代码,最好是把LLDB也安装好。
使用
和大多数sdk一样,fastsocks
启动起来需要一些配置,可以参考fastsocks-simple的相关代码,所有对fastsocks
的操作都在一个java类里面:
com.me.fastsocks.tcp.ConnectionsManager
初始化
主要是设置应用层和底层库的监听PacketDispatcherDelegate,并且调用注册相关jni函数。有时候我们会遇到c/c++的crash,底层库如果崩溃会将崩溃文件保存至crashPath。
void init(PacketDispatcherDelegate dispatcherDelegate,
Context context,String crashPath);
breakpad
安卓c/c++崩溃定位比较困难,借助breakpad
相关工具定位崩溃会简单很多。breakpad
本身就跨平台并且支持android移植,项目里已经有编译好的.a库,fastsocks
使用关联静态库的方式使用breakpad
。
定位崩溃需要的工具也需要自己手动编译,github地址:
这里需要注意:必须在Linux环境下才能编译和使用,如果大家没有Linux环境可以装个VMware,添加个ubuntu虚拟机,至于怎么定位崩溃这里就不赘述了,网上很多这样的教程。
启动和销毁
一般都在登录成功之后启动服务,注销登录的时候销毁服务,参考:
com.me.fastsocks.utils.StartUtils
启动服务
启动服务的时候需要将userId设置到底层库,这里我们使用long类型标示一个用户,当然了如果大家的userId不是long类型的,可以修改相应的实现。
void startSdkService(